c - 函数参数分配?

标签 c memory-management arguments malloc

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/

相关文章:

c - 在 OpenGL C Linux 中移动特定对象

c - CodeBlock 中的结构大小错误

memory - iOS6 MKMapView 使用大量内存,导致应用程序崩溃,其他人注意到了吗?

java - 如何通过多线程java编程最大化资源(RAM和CPU)使用率?

Linux别名问题

c# - 当调用委托(delegate)时,如何发送用作参数的参数列表?

c - strcat 给出段错误

c - C 递归中的因式分解

c - mmap 分配多个页面

javascript - 如何将函数的参数重新分配回原始参数名称?