malloc put" garbage"值

时间:2017-06-13 11:01:47

标签: c malloc strcat garbage

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

#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

3 个答案:

答案 0 :(得分:6)

第一个strcat不正确,因为malloc - 内存未初始化。不要使用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);

答案 1 :(得分:3)

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

  

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

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

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

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

  

strcat函数附加s2指向的字符串的副本(包括   终止空字符)到s1指向的字符串的末尾。 最初的角色   s2的覆盖范围覆盖s1末尾的空字符。

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

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

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

答案 2 :(得分:0)

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

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

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