malloc和realloc数组提供意外输出

Kyu*_*yuu 0 c arrays malloc realloc

当输入为'1 2 3 4 5 6 7 8 9 10 11'时预期输出应与输入相同.然而输出是'1 2 3 4 5 6 7 8 9 10 -1850774484'.仅在输入的整数超过10时才会发生.我的realloc系列在哪里出错了

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

#define INITIAL_SIZE 10

int
main(int argc, char **argv){
    int i = 0, num, size = 0, n = INITIAL_SIZE;
    int *A;

    A = malloc(n * sizeof(int));

    if(A == NULL){
        printf("OUT OF MEMORY\n");
        exit(EXIT_FAILURE);
    }

    while(scanf("%d",&num) == 1 && getchar()!='\n'){
        A[i] = num;
        i++;
        size++;
        if (size >= n){
            n = n * 2;
            A = realloc(A,n * sizeof(int));
        }
    }

    printf("Int Array: ");
    for (i = 0; i <= size; i++){
        printf("%d ", A[i]);
    }
    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Spi*_*rix 5

这没有什么不对realloc.您正在最后一个循环中打印一个额外的未初始化索引.通过改变来修复它

for (i = 0; i <= size; i++)
Run Code Online (Sandbox Code Playgroud)

for (i = 0; i < size; i++)
Run Code Online (Sandbox Code Playgroud)

唯一的问题realloc是你不会像你那样检查它是否成功malloc.另一个问题是你没有释放分配的内存.

  • @Qbb,改用BLUEPIXY的解决方案或添加`A [i] = num; 大小++; i ++;`在'while`循环之后. (2认同)
  • @MOehm将`i`作为下一个索引,将`size`作为当前大小!当我们传递`A [i] = num;`和`i == 9`时,`i`和`size`都会增加到'10`并触发`realloc`,因为它使用`size> = n`(*或等于*).所以我认为循环很好 - 除了它可以执行不必要的重新分配,这就是我们通常在赋值之前重新分配的原因.但是这段代码是有效的. (2认同)