【发布时间】:2018-01-02 12:47:15
【问题描述】:
我正在使用一个 char 指针数组。
#define MAXFIELDS 100
#define MAX_LENGTH 245
char *dex_data[MAXFIELDS]; //declared globally.
我在很多函数中都使用过这个 dex_data 数组。我像这样在主函数中分配内存
dex_data = malloc(sizeof(char *)*MAXFIELDS);
int p;
for(p=0; p < MAXFIELDS ; p++)
dex_data[p] = malloc(sizeof(char)*MAX_LENGTH);
每次都出现分段错误。我试图通过 GDB 检查错误。它说
#0 0x00007fb0a91b2b71 in __strlen_sse2 () from /lib64/libc.so.6
我是否错误地分配了内存,或者我是否尝试分配更大的内存? 我不知道原因。有人可以帮忙吗?提前致谢。
【问题讨论】:
-
请显示出现错误的代码。很有可能您的字符串缺少
'\0',您忘记分配某些内容(这里您为 100 个指针分配空间,但随后只分配 20 个字符串),或者您覆盖了一个指针使其指向随机的地方。 -
到目前为止您显示的内存分配代码看起来不错。有点奇怪,您只为硬编码的 20 个
dex_data条目分配指针,而不是为for (p=0; p < MAXFIELDS; p++) ...分配指针。这会导致一些人怀疑您的其他地方的代码(未显示)是否尊重这一点,而不是访问dex_data[i]一些i20 或更高。 -
我在很多地方都使用过这个 dex_data[],在 strlen() 中的 strcmp() 中,没有做任何其他事情。无论如何,给你一个例子。 if ( strlen(dex_data[6]) > 0 ) { free_qty = atoi(dex_data[6]); } 其他 { free_qty = 0; }
-
不清楚是什么代码导致了您的问题的段错误。但是,例如,如果没有将正确的以零结尾的字符串写入
dex_data[6]指向的位置并且长度为 strlen(dex_data[6]) > 0 可能会导致段错误。 -
我可能记错了,但我很确定 strlen_sse2() 要求内存在 16 字节边界上对齐。您的分配中没有任何内容。
标签: c pointers memory heap-memory