C 中大型动态数组分配 (malloc) 期间的内存错误。它适用于较小的数组

Posted

技术标签:

【中文标题】C 中大型动态数组分配 (malloc) 期间的内存错误。它适用于较小的数组【英文标题】:Memory error during large dynamic array allocation (malloc) in C. It works fine with smaller arrays 【发布时间】:2022-01-22 13:37:58 【问题描述】:
#include <stdio.h>
#include <stdlib.h>


int main()

        int** arr;
        int size_row,size_col,i,j;
        arr = (int**) malloc(size_row*(sizeof(int*)));
        printf("enter the size of the row\n");
        scanf("%d",&size_row);
        printf("enter the size of the column\n");
        scanf("%d",&size_col);
        for(i=0;i<size_row;i++)
        
                *(arr+i) = (int*) malloc(size_col*(sizeof(int)));
        
        for(i=0;i<size_row;i++)
        
                for(j=0;j<size_col;j++)
                
                        printf("arr[%d][%d]=  ",i,j);
                        scanf("%d",&arr[i][j]);
                
        
        for(i=0;i<size_row;i++)
        
                for(j=0;j<size_col;j++)
                
                        printf("arr[%d][%d][%p]=%d\n",i,j,&arr[i][j],arr[i][j]);
                
                printf("\n");
        


此代码适用于较小的数组。但是,如果我输入行大小 = 9 和列大小 = 1000,则会显示分段错误(核心转储)。但是如果我把行大小 = 1000 列大小 = 9,它工作正常。为什么会出现这个内存错误?我正在使用 gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 编译器。提前致谢。

【问题讨论】:

arr = (int**) malloc(size_row*(sizeof(int*))); 执行此语句时您还没有初始化size_row 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

使用前未初始化size_row。

【讨论】:

也许您可以添加更多信息? printf("输入行的大小\n"); scanf("%d",&size_row); arr = (int**) malloc(size_row*(sizeof(int*)));

以上是关于C 中大型动态数组分配 (malloc) 期间的内存错误。它适用于较小的数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记--动态内存分配

动态内存分配

内存空间

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)

没有malloc的c中的动态内存分配

C语言里,啥时候用数组啥时候用指针和动态内存(malloc/calloc)?