C - 马洛克"garbage"值



如何防止或绕过 valus malloc 放入变量中的垃圾? 附加代码和输出! 谢谢!

#include <stdio.h>
#include "stdlib.h"
#include <string.h>
int main() {
char* hour_char = "13";
char* day_char = "0";
char* time = malloc(strlen(hour_char)+strlen(day_char)+2);
time = strcat(time,day_char);
time = strcat(time,"-");
time = strcat(time,hour_char);
printf("%s",time);
free(time);
}

这是我得到的输出:

á[┼0-13

第一个strcat不正确,因为malloc-ed 内存未初始化。不要使用strcat进行第一次写入,而是使用strcpy。这是有道理的,因为最初time没有一个字符串,你可以连接任何东西。

time = strcpy(time, day_char);
time = strcat(time, "-");
time = strcat(time, hour_char);

更好的是,使用sprintf

sprintf(time, "%s-%s", day_char, hour_char);

首先,引用C11,第 7.22.3.4 章(强调我的)

malloc函数为大小由大小指定的对象分配空间其价值是不确定的。

因此,内存位置的内容是不确定的。这是预期的行为。

然后,当您使用与需要字符串的参数相同的指针(即strcat()的第一个参数)时,问题就开始了。

引用第 7.24.3.1 章(再次强调我的)

strcat函数追加由s2指向的字符串的副本(包括 终止空字符)到s1指向的字符串的末尾。初始字符 的s2将覆盖s1末尾的空字符。

但是,在您的情况下,无法保证目标中的终止 null,因此它会导致未定义的行为。

在执行此操作之前,您需要对内存进行 0 初始化(或者,至少内存的第一个元素应该是 null)。您可以使用返回指向已初始化 0 的内存的指针的calloc(),或者至少执行time[0] = '';

另一方面,您还可以使用snprintf()消除初始 0 填充的麻烦。

strcat希望传递一个以空结尾的 C 字符串。你把随机垃圾传递给它。

这可以通过将数据转换为长度为 0 的以 null 结尾的字符串来轻松修复。

char* time = malloc(strlen(hour_char)+strlen(day_char)+2);
time[0] = '';
time = strcat(time,day_char);

最新更新