[strcat&malloc&free],当我使用 strcat() 时,指针似乎不是 NULL,即使我故意将其设为 NULL(没有额外赋值)?
[strcat&malloc&free], when I use strcat(), pointer seems not NULL even I deliberately made it to be(no extra assignment)?
如题,我做了一个demo来说明一下我的困惑。
如果我将 [strcat ] 替换为 [stacpy],我可以得到显而易见的结果,即
@
@
@
所以我怀疑问题出在 [strcat] 上。
void main(){
for(int i=0; i<3 ;i++){
char* str = (char*)malloc(200*sizeof(char));
if(str == NULL){
printf("malloc failed. \n");
return;
}
strcat(str, "@ ");
printf("%s\n", str);
free(str);
str = NULL;
}
}
按我的预期,我应该得到:
@
@
@
但我得到的是:
(1)
@
xK`▒
xK`▒
而且每次都不一样:
(2)
@
x▒
x▒
(3)
@
xk▒▒
xk▒▒
来自man page
The strcat()
function appends the src
string to the dest
string, overwriting the terminating null byte ('[=18=]') at the end of dest
, and then adds a terminating null byte. [...]
注意强调,第一个参数,目的地,应该是一个字符串。
问题是,malloc()
没有 return 指向已初始化内存块的指针。因此,不能保证 returned 内存块中的任何地方都有 null-terminator。因此,在搜索 null-terminator 时,您的程序将访问已分配的内存,并尝试访问无效的内存位置,这会调用 undefined behavior 或 UB。你说
and every time are not the same:
UB 就是这样。
相关,来自 C11
,章节 §7.22.3.4
The malloc
function allocates space for an object whose size is specified by size and
whose value is indeterminate.
如果要将returned 指针用作字符串,则应使用calloc()
,因为内存块是zero-initialized。
如题,我做了一个demo来说明一下我的困惑。
如果我将 [strcat ] 替换为 [stacpy],我可以得到显而易见的结果,即
@
@
@
所以我怀疑问题出在 [strcat] 上。
void main(){
for(int i=0; i<3 ;i++){
char* str = (char*)malloc(200*sizeof(char));
if(str == NULL){
printf("malloc failed. \n");
return;
}
strcat(str, "@ ");
printf("%s\n", str);
free(str);
str = NULL;
}
}
按我的预期,我应该得到:
@
@
@
但我得到的是:
(1) @
xK`▒
xK`▒
而且每次都不一样:
(2) @
x▒
x▒
(3) @
xk▒▒
xk▒▒
来自man page
The
strcat()
function appends thesrc
string to thedest
string, overwriting the terminating null byte ('[=18=]') at the end ofdest
, and then adds a terminating null byte. [...]
注意强调,第一个参数,目的地,应该是一个字符串。
问题是,malloc()
没有 return 指向已初始化内存块的指针。因此,不能保证 returned 内存块中的任何地方都有 null-terminator。因此,在搜索 null-terminator 时,您的程序将访问已分配的内存,并尝试访问无效的内存位置,这会调用 undefined behavior 或 UB。你说
and every time are not the same:
UB 就是这样。
相关,来自 C11
,章节 §7.22.3.4
The
malloc
function allocates space for an object whose size is specified by size and whose value is indeterminate.
如果要将returned 指针用作字符串,则应使用calloc()
,因为内存块是zero-initialized。