考虑以下功能:
char *f()
{
char *s=malloc(8);
}
main()
{
printf("%c",*f()='A');
}
如果我对行char *s=malloc(8);
发表评论,我会收到错误,就像作业*f()='A'
访问了无效内存一样。由于我从不返回任何变量,为什么上面的任务完全有效?
第二个问题:'A'
被分配给返回函数时创建的临时变量。那么为什么++a
等不能用作左值?
答案 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'这里没有分配给临时的。