malloc 放入 "garbage" 个值

malloc puts "garbage" values

我如何防止或绕过 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章(强调我的

The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate.

所以,内存位置的内容是不确定的。 预期的行为。

然后,当您使用与预期 string 的参数相同的指针时,问题就开始了,即 strcat().[=25 的第一个参数=]

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

The strcat function appends a copy of the string pointed to by s2 (including the terminating null character) to the end of the string pointed to by s1. The initial character of s2 overwrites the null character at the end of s1.

但是,在您的情况下,无法保证目标中 终止 null,因此它会导致 undefined behavior.

在这样做之前,您需要对内存进行0-初始化(或者,至少内存的第一个元素应该为空)。您可以使用 calloc() 其中 returns 一个指向已经 0 初始化的内存的指针,或者至少,做 time[0] = '[=19=]';.

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

strcat 期望传递一个以 null 结尾的 C 字符串。你将随机垃圾传递给它。

将您的数据转换为长度为 0 的以 null 结尾的字符串即可轻松解决此问题。

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