gpt4 book ai didi

c - 地址 0x0 未被堆栈、malloc 或(最近)释放

转载 作者:太空狗 更新时间:2023-10-29 15:02:47 24 4
gpt4 key购买 nike

我是 C 的新手,似乎无法弄清楚以下代码有什么问题。

int main() {
char filen[] = "file.txt";
FILE *file = fopen ( filen, "r" );
if ( file != NULL )
{
char line [ 128 ];
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
int i;
char *result;
for(i=0; i< NUM;i++)
{
char *rep;
rep = (char *) malloc (sizeof(mychars[i][0]));
strcpy(rep, mychars[i][0]);
char *with;
with = (char *) malloc (sizeof(mychars[i][1]));
strcpy(with, cgichars[i][1]);
result = (char *) malloc (sizeof(char) * 128);
result = str_replace(line, rep, with);
}


fputs(result, stdout);
}
}
fclose ( file );


return 0;
}

Valgrind 给我这个错误:

==4266== Invalid read of size 1
==4266== at 0x4C286D2: __GI_strlen (mc_replace_strmem.c:284)
==4266== by 0x5118A8D: fputs (iofputs.c:37)
==4266== by 0x400A0F: main (repl.c:35)
==4266== Address 0x0 is not stack'd, malloc'd or (recently) free'd

repl.c 对应于此代码末尾以 fputs 开头的行。

此外,mychars 是一个二维数组,如下所示:

char *mychars[NUM][2] = {
"a", "97",
"b", "98",
....

有人可以告诉我如何解决这个问题吗?此外,非常感谢任何关于我应该如何改进当前代码(尤其是使用 malloc)的指示。

编辑: str_replace 的代码

char *str_replace(char *str, char *orig, char *rep) {
char buffer[4096];
char *p;

if(!(p = strstr(str, orig)))
return NULL;

strncpy(buffer, str, p-str);
buffer[p-str] = '\0';
sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));

return buffer;

}

编辑 2 str_replace 和 main 的新代码

出于测试目的,我已将我的 str_replace 方法替换为此处找到的方法:

What is the function to replace string in C?

我的主要内容略有变化:

int main() {
static const char filen[] = "file.txt";
FILE *file = fopen ( filen, "r" );
if ( file != NULL )
{
char line [ 128 ];
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
int i;
char *result;
for(i=0; i< NUM;i++)
{
char *rep;
rep = (char *) malloc (sizeof(mychars[i][0]));
strcpy(rep, mychars[i][0]);
char *with;
with = (char *) malloc (sizeof(mychars[i][1]));
strcpy(with, mychars[i][1]);
result = str_replace(line, rep, with);
}


fputs(result, stdout);
}
}
fclose ( file );


return 0;
}

但我还是得到了

==6730== Invalid read of size 1
==6730== at 0x4C286D2: __GI_strlen (mc_replace_strmem.c:284)
==6730== by 0x5118A8D: fputs (iofputs.c:37)
==6730== by 0x400995: main (repl.c:29)
==6730== Address 0x0 is not stack'd, malloc'd or (recently) free'd

也许最令人沮丧的部分是不知道这些无效读取错误是什么

编辑 3我已经更新了 for 循环中心的代码:

        int i;
char* result;
result = &line[0];
for(i=0; i< NUM_CGICHARS;i++)
{
char *rep;
rep = (char *) malloc (sizeof(char));
strcpy(rep, cgichars[i][1]);
char *with;
with = (char *) malloc (sizeof(char)*3);
strcpy(with, cgichars[i][0]);
result = str_replace(result, rep, with);
fputs(result, stdout);
free(rep);
free(with);
}

现在我开始获得输出了!然而,仅经过两次迭代后,我就遇到了段错误,valgrind 给了我一大堆这样的错误:

==9130== Invalid read of size 1
==9130== at 0x4C286D2: __GI_strlen (mc_replace_strmem.c:284)
==9130== by 0x5118A8D: fputs (iofputs.c:37)
==9130== by 0x4009DF: main (teststep1.c:27)
==9130== Address 0x0 is not stack'd, malloc'd or (recently) free'd

最佳答案

这两行

            result = (char *) malloc (sizeof(char) * 128);
result = str_replace(line, rep, with);

您首先为 result 分配空间,然后通过返回 str_replace 覆盖它来立即释放空间。该函数可能返回 0,因此您的 fputs 失败。

顺便说一句,不要转换 malloc 的返回值,在 C 中这是多余的,并且可能隐藏您忘记包含原型(prototype)的事实。

编辑:您的str_replace 函数在内存处理方面完全错误。永远不要返回指向局部变量的指针,离开函数后空格无效。

关于c - 地址 0x0 未被堆栈、malloc 或(最近)释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10132031/

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