realloc 不复制第一个索引

realloc not copying first index

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

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

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

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

$ 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 returns 一个指针,您正试图将其分配给 int 对象。

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

另外,用sizeof(*A)sizeof(int)好。两者是等效的,但是 sizeof(*A) 的优点是如果您决定更改数组元素,它仍然是正确的,例如让他们 long.

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