gpt4 book ai didi

c - Malloc、strlen、strcat

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

以下是我正在编写的程序开头的一段代码(其中包含错误)。

    char *name;
char *name2;

if (argn != 2) {
printf("You have to enter the name of the input file");
return 1;
}

name = malloc(strlen(arg[1]) + 1);
name2 = malloc(strlen(arg[1]) + 1);

strcpy(name, arg[1]);
strcpy(name2, arg[1]);

strcat(name2, "-results.pdb");

这里有一个与strcat有关的错误,确实name2没有足够的大小来执行上面的操作。然而 strcat 执行没有问题。然而,稍后在程序的一个完全不相关的部分中,对另一个数组的操作在这个 strcat 之后给出了一个错误。它是一个整数数组,我为其元素分配值,但在我分配所有值之前它给出了一个错误。我假设由于 name2 中没有足够的内存用于上面的操作,这个“不知何故”会影响下一个初始化的数组。我想了解:

1- 这里可能发生了什么,以至于无法写入 name2 的额外信息会影响后面声明的其他数组?

2- 我可能无法在更复杂的程序中如此轻松地回溯这个问题,因为错误发生在其他地方而不是在 strcat 中。我如何防止这种偷偷摸摸的错误,例如影响其他地方完全不相关的数组的 内存问题 进程?

最佳答案

Yet strcat executes without a problem.

不,它没有。它回来了,但它埋下了一颗定时炸弹。正如您稍后观察到的。

发生的是未定义的行为。你已经写入了不允许写入的内存。存储在那里的任何内容现在都是垃圾,并且任何代码期望在那里找到有意义的值现在都行为不端。特别是如果 malloc 内部数据被破坏,观察结果是在稍后尝试重新分配或释放内存时随机崩溃。

正确的方法是分配内存

name2 = malloc(strlen(arg[1]) + sizeof "-results.pdb");

这会处理终止 NUL 的“+1”,因为 sizeof "-results.pdb" 是 13。

使用 asprintf(不是 ISO C,但在任何现代 Unix 上可用)更容易,它根据需要分配内存:

asprintf(&name2, "%s-results.psb", arg[1]);

那里!没有 strlen,没有 strcat,没有 sizeof,没有 malloc。只是做正确的事TM 的一体化调用。

关于c - Malloc、strlen、strcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34632067/

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