首页 > 解决方案 > [strcat&malloc&free],当我使用strcat()时,即使我故意让它成为指针,指针似乎也不是NULL(没有额外的赋值)?

问题描述

作为标题,我做了一个演示来描述我的困惑。

如果我将 [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`▒</p>

xK`▒</p>

而且每次都不一样:

(2)@

x▒</p>

x▒</p>

(3)@

xk▒▒

xk▒▒

标签: cpointersmallocfreedynamic-memory-allocation

解决方案


手册页

该函数将字符串strcat()附加字符串,覆盖 结尾处的终止空字节 ('\0') 然后添加终止空字节。[...]srcdestdest

注意重点,第一个参数,目标,应该是一个字符串

问题是,malloc()不返回指向已初始化内存块的指针。因此,不能保证在返回的内存块中的任何地方都有一个空终止符。因此,在搜索空终止符时,您的程序将访问分配的内存,并尝试访问无效的内存位置,这会调用未定义的行为或 UB。你说

而且每次都不一样:

UB 正是如此。

相关,来自C11§7.22.3.4 章

malloc函数为大小由大小指定且值不确定的对象分配空间。

calloc()如果要将返回的指针用作string ,则应该使用,因为内存块是零初始化的。


推荐阅读