[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。