【问题标题】:Segmentation fault due to strlen_sse2()由于 strlen_sse2() 导致的分段错误
【发布时间】: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 &lt; MAXFIELDS; p++) ... 分配指针。这会导致一些人怀疑您的其他地方的代码(未显示)是否尊重这一点,而不是访问 dex_data[i] 一些 i 20 或更高。
  • 我在很多地方都使用过这个 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


【解决方案1】:

这个:

char  *dex_data[MAXFIELDS];

是一个数组,在堆栈上已经有MAXFIELDS 数量的char* 指针。它是不可分配的。但是,这里:

dex_data = malloc(sizeof(char *)*MAXFIELDS);

您正在尝试分配给它。那是未定义的行为。

只需删除该行。您不需要(也不允许)为dex_data 分配内存。

旁注:分配给数组类型至少应该给你一个编译警告。看来您使用的是非常旧的编译器,您应该升级一下。

【讨论】:

  • 我删除了你说的那行,仍然是分段错误。我在腻子上使用 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) 版本。我没有得到任何警告。但我得到了和以前一样的错误“__strlen_sse2 () from /lib64/libc.so.6”。
  • @Nani 然后是其他原因导致了段错误。删除违规行后,您发布的代码非常好。
  • 程序在任何地方都很好,除了这个 dex_data。我不知道是哪个导致了错误。我是否为这个 dex_data 缓冲区使用了更大的内存?
  • @Nani 为什么不创建一个新的 .c 文件,其中只有这些行?它会崩溃吗?
  • 你可以找到我的代码here。这就是结论,我是这样使用 dex_data[] 的。或者还有任何其他类型的用法(关于 dex_data)?我们知道它是一个双指针。
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多