1

考虑以下函数:

 char *f()
 {   
 char *s=malloc(8);
 }
 main()
 {
  printf("%c",*f()='A');
 }

如果我评论该行char *s=malloc(8);,我会收到一个错误,就好像分配*f()='A'访问了无效内存一样。既然我从不返回任何变量,为什么上面的赋值完全起作用?

第二个问题:'A'分配给函数返回时创建的临时变量。那么为什么不能将++aetc. 用作左值呢?

4

6 回答 6

4

假设返回值在寄存器中传递,当从 f() 返回时,malloc 的返回值可能仍然存在。纯属偶然。

分配给*f()您时不是分配给临时的,而是分配给从 malloc 返回的内存。分配给 ++a 是完全不同的。

于 2011-08-02T09:41:32.210 回答
0

您的函数f()没有返回任何内容,您需要添加:

return s;

但是,老实说,这只是你问题的开始。您还需要free()返回值f()

我不知道您为什么将这个问题标记为 C++,这显然是 C,所以我没有这样标记。

于 2011-08-02T09:37:20.890 回答
0

您必须在f()语句中返回指针return,否则将返回非法指针:

char *f()
{   
    char *s=malloc(8);
    return s;
}
于 2011-08-02T09:38:34.133 回答
0

您的函数不返回任何内容。由于您使用 return-type 声明函数,因此char *不返回任何内容会导致未定义的行为,如当前 C++ 标准的第 6.6.3.2 段中所定义:

从函数的末尾流出相当于return没有值的 a;这会导致值返回函数中的未定义行为。

未定义的行为意味着任何事情都可能发生。要解决该问题,您的函数应如下所示:

char *f()
{   
    return malloc(8);
}
于 2011-08-02T09:45:49.403 回答
0

在您的函数中,您返回一个指针,您可以在其中分配东西......通过返回引用或实例++a来防止它。const如果你有,你可以有同样的行为const char* f() { ... }

当然你也可以用++a不同的方式实现:)

于 2011-08-02T09:50:09.477 回答
0

1/ f() 的返回是一个未初始化的指针,但存在。
*f() 返回未指定(随机)地址指向的值。
在此地址写入是无效的内存访问,或者如果此地址“偶然”是一块可写的内存(堆栈或先前分配的堆),则可能不是。
在 C 中,您有责任确保正确访问内存。

2/ 'A' 在这里没有分配给一个临时的。

于 2011-08-02T09:50:53.160 回答