C 挡泥板和指针数组

C 挡泥板和指针数组,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,我刚刚实现了一个相当复杂的软件,但学校的测试系统不会接受它。 系统使用所谓的mudflap库,它应该能够更好地防止非法内存访问。因此,我的程序在学校的测试系统上运行时会生成SEGFULTS(我提交源代码,测试系统使用mudflap库自行编译) 我试图在我的程序中分离出有问题的代码,似乎这一切都归结为指针数组这样简单的东西。Mudflap似乎不喜欢它们 下面是一段使用指针数组的非常简单的代码: #include <stdlib.h> int main() { char** rows;

我刚刚实现了一个相当复杂的软件,但学校的测试系统不会接受它。 系统使用所谓的mudflap库,它应该能够更好地防止非法内存访问。因此,我的程序在学校的测试系统上运行时会生成SEGFULTS(我提交源代码,测试系统使用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;

这里至少有一个问题:

char** rows;
rows=(char**)malloc(3);
这将分配3个字节。在大多数平台上,分配器可能至少有4个字节,这样就可以稍微覆盖缓冲区。我猜您的mudflap库在检查和捕获覆盖方面更加严格

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

尝试将这些行更改为:

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

编辑:根据您修改的代码,我同意它现在看起来是正确的。我唯一能建议的是,
malloc()
可能失败并导致空指针访问。如果不是这样,听起来像是挡泥板的bug或配置错误。

这是不正确的代码。您分配的是3个字节,而不是3*sizeof(char*)。你也在泄漏内存。我修复了代码。那真的只是一个打字错误。关键是——这个版本也不起作用。(现在我甚至正在释放分配的内存,尽管在这里这样做没有意义。)我的道歉。是的,你说得对。malloc的第一个参数应该是sizeof(char*)。问题是。它也不起作用/malloc()只有一个参数。你是说
3*sizeof(char*)
?我修正了问题中的代码。关键是mudflap仍然不喜欢它:/。添加到我的答案中。我同意这看起来是正确的。也许malloc正在返回NULL?不应该是这么小的尺寸,但值得检查。事实并非如此。事实上,这甚至不是我真正关心的代码。这只是我为了说明问题而迅速写的东西。在实际代码中,我使用的是一些相当大的数组,我倾向于认为如果我在那里出错,它会生成一个真正的segfault(它不会,否则代码会100%工作)。此外,我在实际代码中进行的每个分配都会断言(),因此很容易发现失败的分配。这一切似乎都是孤立的。不幸的是,挡泥板是我在这里依赖的组件。
char** rows;
rows=(char**)malloc(3 * sizeof(char *));