为什么不能将malloc输出分配给结构的地址?
这会产生左值误差:
struct winErs
{
int netds;
char* blts;
};
void func_3(struct winErs gibble){
printf("this is the address of the gibble %d \n", &gibble);
&gibble = malloc(sizeof(struct winErs));
}
int main(int argc, char const *argv[])
{
struct winErs simple_Case;
func_3(simple_Case);
return 0;
}
这不会出错:
struct winErs
{
int netds;
char* blts;
};
void func_3(struct winErs *gibble){
printf("this is the address of the gibble %d \n", &gibble);
gibble = malloc(sizeof(struct winErs));
}
int main(int argc, char const *argv[])
{
struct winErs simple_Case;
func_3(&simple_Case);
return 0;
}
有没有一个很好的解释为什么这不起作用?感谢。
答案 0 :(得分:3)
暂不使用标准语言,该标准涉及lvalue
和rvalue
s ...
gibble
已有地址。您无法更改该地址。您只能更改其值。
只能更改指针的值,使其指向内存中的其他位置。
即使在案例2 中,您也不会更改函数中simple_Case
的地址。您只是在func_3
中更改指针的值。这是函数的局部变化。这是一个内存泄漏,BTW。由malloc
分配的内存对于调用函数是不可见的。因此,调用函数无法释放它。
答案 1 :(得分:1)
在func_3()
case2中,gibble
以main
的{{1}}地址开头。稍后它会使simple_Case
返回指针的值。当然没什么奇怪的,malloc()
是一个指针,它的值随着代码的进行而改变。
在case1中,代码尝试使用gibble
更改变量的地址。变量的地址不可更改。请注意,如果变量被优化为仅作为处理器的寄存器存在,则该变量甚至可能没有地址。
答案 2 :(得分:1)
因为值的位置由编译器确定。这不是你通过转让或任何其他方式改变的东西。 &gibble
是gibble
的位置。它不能以1 = 42;
不会将常数1的值更改为42的相同意义分配。不可分配与说它不是l值相同。
实际上,如果你住在1 Baker St.,如果有人决定将你的地址指定为2 Baker St.,那么认为你的房子会自发地在街对面跳跃是愚蠢的。编译器只是以自己古怪的方式告诉你这种愚蠢。
另一方面,gibble
是能够存储任何其他值的位置的位置的名称。 (嗯,不完全是,但我们不会进入内存对齐和C语义的尼特。)所以赋值工作正常。