考虑以下函数:
char *f()
{
char *s=malloc(8);
}
main()
{
printf("%c",*f()='A');
}
如果我评论该行char *s=malloc(8);
,我会收到一个错误,就好像分配*f()='A'
访问了无效内存一样。既然我从不返回任何变量,为什么上面的赋值完全起作用?
第二个问题:'A'
分配给函数返回时创建的临时变量。那么为什么不能将++a
etc. 用作左值呢?
考虑以下函数:
char *f()
{
char *s=malloc(8);
}
main()
{
printf("%c",*f()='A');
}
如果我评论该行char *s=malloc(8);
,我会收到一个错误,就好像分配*f()='A'
访问了无效内存一样。既然我从不返回任何变量,为什么上面的赋值完全起作用?
第二个问题:'A'
分配给函数返回时创建的临时变量。那么为什么不能将++a
etc. 用作左值呢?
假设返回值在寄存器中传递,当从 f() 返回时,malloc 的返回值可能仍然存在。纯属偶然。
分配给*f()
您时不是分配给临时的,而是分配给从 malloc 返回的内存。分配给 ++a 是完全不同的。
您的函数f()
没有返回任何内容,您需要添加:
return s;
但是,老实说,这只是你问题的开始。您还需要free()
返回值f()
。
我不知道您为什么将这个问题标记为 C++,这显然是 C,所以我没有这样标记。
您必须在f()
语句中返回指针return
,否则将返回非法指针:
char *f()
{
char *s=malloc(8);
return s;
}
您的函数不返回任何内容。由于您使用 return-type 声明函数,因此char *
不返回任何内容会导致未定义的行为,如当前 C++ 标准的第 6.6.3.2 段中所定义:
从函数的末尾流出相当于
return
没有值的 a;这会导致值返回函数中的未定义行为。
未定义的行为意味着任何事情都可能发生。要解决该问题,您的函数应如下所示:
char *f()
{
return malloc(8);
}
在您的函数中,您返回一个指针,您可以在其中分配东西......通过返回引用或实例++a
来防止它。const
如果你有,你可以有同样的行为const char* f() { ... }
。
当然你也可以用++a
不同的方式实现:)
1/ f() 的返回是一个未初始化的指针,但存在。
*f() 返回未指定(随机)地址指向的值。
在此地址写入是无效的内存访问,或者如果此地址“偶然”是一块可写的内存(堆栈或先前分配的堆),则可能不是。
在 C 中,您有责任确保正确访问内存。
2/ 'A' 在这里没有分配给一个临时的。