我不知道这是什么错误,因为这是在Windows上,我不知道如何在Windows上执行程序执行。 有关为什么程序在这里崩溃的任何想法(请参阅注释行)? 我认为这可能与内存滥用有关。
#define TABLE_MAX_ROW 500 #define TABLE_MAX_COL 20 #define TABLE_MAX_ELT_LEN 60
从这里开始:
foo() { char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN]; bar(table); }
传递给这个函数:
bar(char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN]) { unsigned int col,row; if (table == NULL) { // crashes here printf("error: table == NULL!n"); return -1; } for (row = 0; row < TABLE_MAX_ROW; row++) for (col = 0; col < TABLE_MAX_COL; coL++) table[row][col][0] = ' '; // if above if block commented out,crashes here return 0; }
为什么连续调用new 不分配连续内存?
HeapWalk块枚举返回不在堆中的地址
在linux中的信号量和共享内存
Linux:pipe理我的进程中的虚拟内存映射以进行快速仿真
为什么calloc无法在具有4GB内存的系统上分配1GB?
Windows工作stream运行时泄漏了大量的内存
当加载/清除大量的数据时,std :: vector会变得越来越慢
将运行Linux进程的内存地址范围转换为目标文件中的符号?
C ++保留内存空间
正如所写的,NULL检查bar是不必要的,因为table不是在foo动态分配的。
话虽如此,你可能超过你的堆栈框架大小与数组定义(60 Kb),导致运行时问题bar ,导致崩溃。
尝试动态分配数组,如下所示:
void foo (void) // explicitly type all functions { /** * Declare a *pointer* to a 2D array of col x len and * allocate rows elements of it: */ char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN] = malloc(sizeof *table * TABLE_MAX_ROW); if (table) { bar(table); } free(table); } int bar(char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN]) { unsigned int row,col; /** * Some duplication of effort here,since we made the null check * in foo,but what the heck. */ if (!table) { // handle error as above return -1; } // process table as above return 0; }
尝试为正在创建的3D阵列分配空间
char *** table = malloc(sizeof(sizeof(sizeof(char)* TABLE_MAX_ELT_LEN)* TABLE_MAX_COL)* TABLE_MAX_ROW)
这至少会给你足够的空间来满足你所有的要素。
程序存储器取决于操作系统。 我强烈怀疑崩溃的原因是你的系统无法满足堆栈上这么大的数组分配(差不多0.6MB!)。 最好去malloc 。
问题可能是堆栈上没有足够的空间来分配大量的缓冲区。 我会建议你动态分配数组。
您也可以使用方便的宏来分配一个平缓冲区,如本文所述。 唯一的区别是你的数组是“3d”而不是“2d”。
您正在为您的“表”变量在堆栈上使用500x20x60 = 600000字节进行分配。
如果你的shell是bash
ulimit -s ( limit stacksize [t] csh的limit stacksize )
将显示您可以在程序堆栈上使用的最大内存量。 如果你使用超过这个限制,这是你的程序段错误的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。