我在代码下面运行,我的输出为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;
}
答案 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)