realloc有什么问题?

ovn*_*nia 5 c

开始在C学习malloc.h.想法是创建动态数组.这是代码:

#include <stdio.h>
#include <conio.h>
#include <malloc.h>

int main() {
    int *array = (int*)malloc(sizeof(int));
    int i, j, val;
    for (i = 0;; i++) {
        array = (int*)realloc(array, sizeof(int) + sizeof(*array));
        printf("Enter array[%d]=", i);
        scanf("%d", (array + i));
        if (*(array + i) == 0) break;
    }
    for (j = 0; j < i; j++) {
        printf("[%d] = %d\n", j, *(array + j));
    }
    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是

Enter array[0]=1
Enter array[1]=2
Enter array[2]=3
Enter array[3]=4
Enter array[4]=5
Enter array[5]=6
Enter array[6]=7
Enter array[7]=8
Enter array[8]=9
Enter array[9]=10
Enter array[10]=0
[0] = 1
[1] = 2
[2] = 3
[3] = 4
[4] = 5
[5] = 6
[6] = 7
[7] = 8
[8] = 542979931
[9] = 875896893
Run Code Online (Sandbox Code Playgroud)

每次,>=8值都是随机的.我不知道为什么会发生这样的错误呢?

Kir*_*rov 7

您在代码中未定义的行为.我想,这样做:

array=(int*)realloc(array,sizeof(int)+sizeof(*array));
Run Code Online (Sandbox Code Playgroud)

你期望,这sizeof(*array)将返回整个阵列的大小,对吧?但事实并非如此.sizeof在编译时计算并且执行sizeof(*array)实际上与sizeof(int).

因此,要使此数组可扩展,您需要拥有其他变量,保持当前数量的元素并执行以下操作:

array=(int*)realloc(array, sizeof(int) + current_size_of_array * sizeof( int ) );
Run Code Online (Sandbox Code Playgroud)

当你实际添加一个元素时,current_size_of_array将在每个循环上for增加.