我如何防止或绕过我的变量中的垃圾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
答案 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);