动态分配的数组结束

End of dynamically allocated array

这是我的第一个问题。对不起,如果我做错了什么。感谢您的理解。

我有一个动态分配的数组,

int *read_array(char *file_path , int *arr){

    int max = 0 ,min = 0, i = 0;
    FILE *fp = fopen(file_path,"r");

    arr= malloc(1 * sizeof(int));

    fscanf(fp, "%d,", &arr[i] );
    max = arr[i];
    min = arr[i];
    i++;
    arr = realloc(arr , i * sizeof(int));

    while(fscanf(fp, "%d,", &arr[i] ) != EOF){

        if(max < arr[i]){
            max = arr[i];
        }
        else if(min > arr[i] ){
            min = arr[i];
        }

        i++;
        arr = realloc(arr , (i +1) * sizeof(int));

    }
    printf("%d\n",arr[i + 10]);
    free(arr);
}

我试图打印数组第 (i+10) 个索引处的内容。它打印“0”。

但是当我像 printf("%d\n",arr[i + 100000]); 那样制作 printf 时,我如预期的那样遇到了段错误。但我认为我分配了与 "i" 一样多的内存。

为什么 arr[i+10] 没有给出段错误?

感谢您的宝贵时间。

这是一个数组越界逻辑错误,但它很有可能不会抛出分段错误,因为 malloc 分配的内存比您预期的要多。

C 标准不要求 malloc() 到 return 指向 恰好 您要求的内存量的指针。您传递给 malloc() 的参数被系统视为它 return 给您的内存块所需的最小大小。

系统为您提供比您要求的内存多得多的情况并不少见,原因是编码人员实际上不需要了解或理解的对齐和其他复杂的操作系统原因。

尝试在您的系统上编译并运行此程序以查看我所说内容的证据:

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

#define VALUE 150 //Or whatever you want

int main(){
  for(int i=0;i<VALUE;++i){
    void *pt=malloc((size_t)i);
    printf("Asked for %d bytes, received %zd bytes\n",i,malloc_usable_size(pt));
    free(pt);
  }
}