gpt4 book ai didi

c - realloc 不复制第一个索引

转载 作者:行者123 更新时间:2023-12-04 12:33:25 27 4
gpt4 key购买 nike

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

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

int main(){
int n;
printf("Enter size of array\n");
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("%d\n",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) 的优点是,如果您决定更改数组元素,它仍然是正确的,例如使它们

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

关于c - realloc 不复制第一个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266299/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com