【问题标题】:[strcat&malloc&free], when I use strcat(), pointer seems not NULL even I deliberately made it to be(no extra assignment)? [duplicate][strcat&malloc&free], when I use strcat(), pointer seems not NULL even I deliberately made it to be(no extra assignment)? [duplicate]
【发布时间】:2019-10-05 22:33:29
【问题描述】:

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

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

【问题讨论】:

  • 请先谷歌。我找到的重复答案是我对strcpy strcat 的第一个谷歌搜索结果。
  • 对不起,谢谢。下次我会尽量不要这么懒。

标签: c pointers malloc free dynamic-memory-allocation


【解决方案1】:

来自man page

strcat() 函数将src 字符串附加到dest 字符串,覆盖dest 末尾的终止空字节('\0'),然后添加一个终止空字节。 [...]

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

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

而且每次都不一样:

这就是 UB 的确切含义。

相关,来自C11,第 7.22.3.4 章

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

如果你想使用返回的指针作为字符串,你应该使用calloc(),因为内存块是零初始化的。

【讨论】:

  • 非常感谢,看来我的基础一点都不扎实。不仅给了我解决方案,还给了我生成它的方法,太棒了!
猜你喜欢
  • 2022-12-27
  • 2022-11-09
  • 2022-12-26
  • 2016-04-10
  • 1970-01-01
  • 2022-12-02
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多