c - 挡泥板和指针数组

标签 c pointers segmentation-fault

我刚刚实现了一个相当复杂的软件,但我学校的测试系统不接受它。 系统使用所谓的 mudflap 库,应该能够更好地防止非法内存访问。因此,我的程序在学校的测试系统上运行时会生成段错误(我提交源代码,测试系统使用 mudflap 库自行编译它)。

我试图隔离程序中有问题的代码,似乎一切都归结为像指针数组一样简单的东西。 Mudflap 似乎不喜欢它们。

下面是一些非常简单的代码,可以使用指针数组:

#include <stdlib.h>
int main()
{
char** rows;
rows=(char**)malloc(sizeof(char*)*3);
rows[0]=(char*)malloc(sizeof(char)*4);
rows[1]=(char*)malloc(sizeof(char)*4);
rows[2]=(char*)malloc(sizeof(char)*4);
strcpy(rows[0], "abc");
strcpy(rows[1], "abc");
strcpy(rows[2], "abc");
free(rows[0]); free(rows[1]); free(rows[2]);
free(rows);
return 0;

这将产生带有挡泥板的段错误。在我看来,这是一部完全合法的代码。 您能否向我解释一下它出了什么问题,以及为什么它会产生带有 mudflap 的段错误?

注意:该程序需要在 amd64 linux 系统下使用 g++ 编译,使用以下命令:

    export MUDFLAP_OPTIONS='-viol-segv -print-leaks';
    g++ -Wall -pedantic -fmudflap -fmudflapir -lmudflap -g file.cpp

最佳答案

您至少遇到一个问题:

char** rows;
rows=(char**)malloc(3);

这分配了 3 个字节。在大多数平台上,分配器可能至少有 4 个字节,这样您就可以稍微覆盖缓冲区。我猜你的 mudflap 库在检查方面更加严格并捕获了覆盖。

但是,如果您想要一个包含 3 个 char * 指针的数组,则可能至少需要 12 个字节。

尝试将这些行更改为:

char** rows;
rows=(char**)malloc(3 * sizeof(char *));

编辑:根据您修改后的代码,我同意它现在看起来是正确的。我唯一可以建议的是,也许 malloc() 失败并导致 NULL 指针访问。如果情况并非如此,这听起来像是 mudflap 的错误或配置错误。

关于c - 挡泥板和指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13737141/

相关文章:

c - 为什么这个循环在C中变成无限循环?

c - 尝试取消引用指针 : C 时出现段错误

c - 在结构体 : segmentation fault 中输入字符串

c - 在结构中使用 posix_memalign 出现段错误

c - 将文件读入链表时出现段错误

c - 如何从非浏览器设备发出 HTTP POST?

c - 学习共享内存、分布式内存和/或 GPU 编程的示例问题和解决方案是什么?

c - CUDA FFT 函数调用期间出现错误“code=2(CUFFT_ALLOC_FAILED)”

java - c++ "new"关键字与 java 的比较

c - 阅读 C 指针类型声明