char* foo(char* str)
{
return str;
}
int main()
{
printf("%s", foo(malloc(10)));
return 1;
}
我只是想知道这是否是一个适当的声明。输出是否为空字符串?
它实际分配了吗?
范围是否已扩展,是否已保存到动态内存区域?
它会导致任何u / b或只是崩溃吗?
在我的测试编译器(Pelles C)上,它崩溃了。
答案 0 :(得分:3)
malloc(10)
分配10个字节的连续内存
实际上,malloc()
试图分配这么多的内存,但总的来说,不能确定这是否成功。
在进一步执行程序的执行流程之前,需要对NULL进行比较。
让我们假设已经正确分配了10个字节
它导致指向占用10个字节的已分配对象的void*
指针
当作为参数传递给foo()
时,它将转换为char*
指针
由于char
个对象只占用1个字节,因此10个分配的字节可以重新解释为10个字符的数组。
char*
指针str
指向的地址可以作为10个字符的数组安全地访问。
但是,char*
指针与" C字符串"不同。
A" C字符串"是一个以空字符结尾的char数组
所以,这里的问题是你的参数str
是否有一个标记字符串结尾的空字符'\0'
。
很可能情况并非如此
如果" legal"之外有空字符。 10个分配字节的边界,函数printf()
将尝试访问错误的内存位置。
崩溃是最可能的结果。
答案 1 :(得分:2)
使用%s
格式说明符时,请确保指针终止'\0'
。在你的
示例内存已分配,但不会'\0'
终止。