char* foo(char* str)
{
return str;
}
int main()
{
printf("%s", foo(malloc(10)));
return 1;
}
我只是想知道这是否是一个正确的声明。输出是否为空字符串?
它真的分配了吗?
作用域是否扩展并保存到动态内存区?
它会导致任何 u/b 还是只是崩溃?
在我的测试编译器 (Pelles C) 上,它崩溃了。
最佳答案
malloc(10)
分配 10 字节的连续内存。
事实上,malloc()
尝试分配此内存量,但通常无法确定是否成功。
在进一步执行程序流程之前,需要与 NULL 进行比较。
让我们假设这 10 个字节已正确分配。
它导致 void*
指针指向占用 10 个字节的已分配对象。
当作为参数传递给 foo()
时,它会转换为 char*
指针。
由于 char
对象恰好占用 1 个字节,因此分配的 10 个字节可以重新解释为 10 个字符的数组。
char*
指针 str
指向的地址可以作为 10 个字符的数组安全访问。
但是,char*
指针与“C 字符串”不同。
“C 字符串”是以空字符结尾的 char 数组。
所以,这里的问题是如果你的参数 str
有这样一个空字符 '\0'
标记字符串的结尾。
很可能不是这样。
如果在分配的 10 个字节的“合法”边界之外存在空字符,函数 printf()
将尝试访问错误的内存位置。
崩溃是最有可能的结果。
关于c - 函数参数分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483796/