C - realloc 不复制第一个索引



我在将malloc/realloc命令与数组一起使用时遇到了一些问题。我创建了一个包含一些整数的小数组,并尝试通过使用 realloc 扩展大小并添加值来向其添加一个值,但是当我这样做时,0 索引的值不会被保留并且被视为垃圾。

#include <stdio.h>
#include <stdlib.h>
int main(){
int n;
printf("Enter size of arrayn");
scanf("%d",&n);
int *A = malloc(n*sizeof(int));
for(int i = 0; i < n; i++){
A[i] = i + 1;
}
*A = realloc(A, sizeof(A)+ sizeof(int));
A[n] = 1234;
for(int i = 0; i < n + 1; i++){
printf("%dn",A[i]);
}

return 0;
}

当我运行程序时,会发生这种情况:

Enter size of array
5
14643216
2
3
4
5
1234

有谁知道为什么数组的 0 索引获得此值而不是 1?

$ gcc a.c
a.c: In function ‘main’:
a.c:12:12: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
*A = realloc(A, sizeof(A)+ sizeof(int));
^

确保将编译器配置为对看起来可疑的代码发出警告。任何远程体面的编译器都会在此行上至少发出警告,如果不是错误的话。realloc返回一个指针,您尝试将其分配给int对象。

您需要将生成的指针分配给A,而不是*A。此外,还有另一个错误,编译器无法警告您。sizeof(A)+ sizeof(int)太小,在上下文中没有多大意义。请注意,sizeof(A)指针A的大小。无法使用sizeof来查找数组中A指向的项数,因为sizeof依赖于编译时信息。要将数组扩展一个元素,您需要将sizeof(int)添加到当前分配的大小(即n*sizeof(int),即新大小应(n+1) * sizeof(int)

此外,使用sizeof(*A)比使用sizeof(int)更好。这两者是等价的,但sizeof(*A)的优点是,如果您决定更改数组元素,例如使它们long,它仍然是正确的。

A = realloc(A, (n+1) * sizeof(*A));

A = realloc(A, (n + 1) * sizeof(int));而不是*A = realloc(A, sizeof(A)+ sizeof(int));

*A = ...如果第一个索引的值未移动到内存中的另一个位置A则会用"地址值"覆盖该值(否则未定义的行为)。

请注意,sizeof(A)是一个常量值(可能是 8,而不是之前分配的内存量),因此您很有可能realloc没有移动内存。

相关内容

  • 没有找到相关文章

最新更新