gpt4 book ai didi

c - 挡泥板和指针数组

转载 作者:行者123 更新时间:2023-11-30 18:42:55 25 4
gpt4 key购买 nike

我刚刚实现了一个相当复杂的软件,但我学校的测试系统不接受它。系统使用所谓的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com