realloc不复制第一个索引

时间:2018-03-13 21:41:35

标签: c malloc realloc

我在使用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?

2 个答案:

答案 0 :(得分:5)

console.log(str.split(" ")[0]);

确保将编译器配置为对看起来可疑的代码发出警告。任何远程合适的编译器都会在此行上至少引发一个警告,如果不是错误的话。 $ 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

答案 1 :(得分:2)

撰写A = realloc(A, (n + 1) * sizeof(int));代替*A = realloc(A, sizeof(A)+ sizeof(int));

*A = ...将使用&#34;地址值&#34;覆盖第一个索引的值。如果A未移动到内存中的其他位置(否则为未定义的行为)。

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