c - [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▒▒
解决方案
从手册页
该函数将字符串
strcat()
附加到字符串,覆盖 结尾处的终止空字节 ('\0') ,然后添加终止空字节。[...]src
dest
dest
注意重点,第一个参数,目标,应该是一个字符串。
问题是,malloc()
不返回指向已初始化内存块的指针。因此,不能保证在返回的内存块中的任何地方都有一个空终止符。因此,在搜索空终止符时,您的程序将访问分配的内存,并尝试访问无效的内存位置,这会调用未定义的行为或 UB。你说
而且每次都不一样:
UB 正是如此。
相关,来自C11
§7.22.3.4 章
该
malloc
函数为大小由大小指定且值不确定的对象分配空间。
calloc()
如果要将返回的指针用作string ,则应该使用,因为内存块是零初始化的。
推荐阅读
- python - discord.py 针对不同的检查失败引发不同的错误
- sql - 我的“删除设置默认值”有什么问题?
- python - Django:在模型中创建一个特定于用户的值
- php - 我想在 php 上包含来自网络的代码。示例:需要“domain.com/folder/file.php”;
- javascript - 您可以使用 Crossfilter 在组内过滤吗
- google-apps-script - Google App Script My Project 中的多个文件
- python - Python温度转换器中请求的错误处理帮助
- python - 从“外部”目录导入模块 [Python]
- python - 来自初学者的简单 DataFrame 问题
- vue.js - Vue:导入 JSON 请求加载器