为什么函数的返回值可以分配给?

时间:2011-08-02 09:33:41

标签: c function return-value lvalue

考虑以下功能:

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

如果我对行char *s=malloc(8);发表评论,我会收到错误,就像作业*f()='A'访问了无效内存一样。由于我从不返回任何变量,为什么上面的任务完全有效?

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

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

return s;

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

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

答案 2 :(得分:0)

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

char *f()
{   
    char *s=malloc(8);
    return s;
}

答案 3 :(得分:0)

您的功能不会返回任何内容。由于您使用返回类型char *声明函数,因此不返回导致未定义行为的任​​何内容,如当前C ++标准的6.6.3.2节中所定义:

  

离开函数末尾相当于return没有   值;这会导致值返回时出现未定义的行为   功能

未定义的行为意味着anything can happen。要解决这个问题,您的函数应如下所示:

char *f()
{   
    return malloc(8);
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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