使用realloc时出现奇怪的错误

时间:2016-08-20 14:11:02

标签: c++ realloc

我在代码下面运行,我的输出为8 0 4,而不是8 9 4.请你帮我理解这段代码的问题 -

#include <cstdlib>
#include <iostream>

using namespace std;

int main() { 
    int *p;

    p = (int*)calloc(2, sizeof(int));

    *(p + 0) = 8;
    *(p + 1) = 9;

    p = (int*)realloc(p, 3);

    *(p + 2) = 4;

    for (int i = 0; i < 3; i++)
        cout << p[i] << " ";

    free(p);
    p = NULL;
}

3 个答案:

答案 0 :(得分:1)

The realloc function需要 bytes 的大小,而不是元素。

你需要做

int *temp = realloc(p, 3 * sizeof(*temp));
if (temp == NULL)
{
    // Handle error...
}
p = temp;

请注意,我使用临时变量作为realloc的结果。这是因为如果realloc失败,它将返回NULL并将结果重新分配给您作为第一个参数传递的指针,然后您将丢失原始指针。

答案 1 :(得分:1)

指定为realloc()的参数的大小必须计算为多个字节。正如您自己发现的那样,简单的解决方法是

p = (int*)realloc(p, 3 * sizeof(int));

顺便提一下,如果*p的类型稍后更改,您可以使用int类型而不是p来避免潜在的不一致:

p = (int*)realloc(p, 3 * sizeof(*p));

但是由于在C ++中需要强制转换,因此至少可以看到不一致性。 您还应该测试calloc()realloc()是否成功。它们不会抛出异常,但会在内存不足时返回NULL

请注意,您应该决定是使用C还是C ++编程。这些语言有一个共同的祖先,但显着不同,一个中使用的一些习语在另一个中被认为是坏的风格,因为更合适和更安全的结构可用。

以下是您在C中修改的程序版本:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) { 
    int *p = calloc(2, sizeof(*p));
    assert(p != NULL);

    *(p + 0) = 8;
    *(p + 1) = 9;

    p = realloc(p, 3 * sizeof(*p));
    assert(p != NULL);

    *(p + 2) = 4;

    for (int i = 0; i < 3; i++) {
        printf("%d ", p[i]);
    }
    putchar('\n');
    free(p);
    return 0;
}

虽然PaulMcKenzie的C ++程序实现了同样的功能,但仍然不赞成使用指针p

#include <vector>
#include <iostream>

using namespace std;

int main() { 
    std::vector<int> pV(2);
    int *p = pV.data();
    *(p + 0) = 8;
    *(p + 1) = 9;
    pV.resize(3);
    p = pV.data();
    *(p + 2) = 4;
    for (int i = 0; i < 3; i++) {
        cout << p[i] << " ";
    }
}

如您所见,std::vector<int>::resize()获取元素数量,无需计算字节数。

使用指针尤其是指针算法在C ++中不是一个好习惯,更简单的版本是:

#include <vector>
#include <iostream>

using namespace std;

int main() { 
    std::vector<int> v(2);
    v[0] = 8;
    v[1] = 9;
    v.resize(3);
    v[2] = 4;
    for (int i = 0; i < 3; i++) {
        cout << v[i] << " ";
    }
}

您还可以使用枚举器进行打印输出。

答案 2 :(得分:-2)

好的,我遇到了问题:

p = (int*)realloc(p, 3);

我指定的尺寸值是3,应该是3 * sizeof(int)