函数参数分配?

时间:2014-06-30 06:05:09

标签: c memory-management arguments malloc

char* foo(char* str)
{
    return str;
}

int main()
{
    printf("%s", foo(malloc(10)));

    return 1;
}

我只是想知道这是否是一个适当的声明。输出是否为空字符串?

它实际分配了吗?

范围是否已扩展,是否已保存到动态内存区域?

它会导致任何u / b或只是崩溃吗?

在我的测试编译器(Pelles C)上,它崩溃了。

2 个答案:

答案 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'终止。