以下是我正在编写的程序开头的一段代码(其中包含错误)。
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 中。我怎样才能防止这种偷偷摸摸的错误,比如memory problematic
进程影响其他地方完全不相关的数组?
然而 strcat 执行没有问题。
不,没有。它回来了,却埋下了定时炸弹。正如你稍后观察到的。
发生的情况是未定义的行为。你已经写入了你不被允许写入的内存。存储在那里的任何内容现在都是垃圾,并且任何代码期望在那里找到有意义的值现在都行为不当。
特别是如果 malloc 内部数据已损坏,则稍后尝试重新分配或释放内存时会观察到随机崩溃。
正确的方法是分配内存
name2 = malloc(strlen(arg[1]) + sizeof "-results.pdb");
这会处理终止 NUL 的“+1”,因为sizeof "-results.pdb"
is 13.
更简单的是使用asprintf
(不是 ISO C,但在任何现代 Unix 上都可用),它根据需要分配内存:
asprintf(&name2, "%s-results.psb", arg[1]);
There! No strlen, no strcat, no sizeof, no malloc. Just an all-in-one call doing the Right ThingTM.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)