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);
我如何防止或绕过 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 bys2
(including the terminating null character) to the end of the string pointed to bys1
. The initial character ofs2
overwrites the null character at the end ofs1
.
但是,在您的情况下,无法保证目标中 终止 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);