将malloc输出分配给地址?左值误差

将malloc输出分配给地址?左值误差,c,malloc,lvalue,C,Malloc,Lvalue,为什么不能将malloc输出分配给结构的地址 案例1 这会产生左值错误: 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(i

为什么不能将malloc输出分配给结构的地址

案例1 这会产生左值错误:

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;
}
案例2 这不会给出一个错误:

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;
}

有没有一个好的解释来解释为什么这不起作用?谢谢。

撇开标准的语言不谈,
左值和
右值

gibble
已经有地址了。你不能改变那个地址。您只能更改其值

只能更改指针的值,使其指向内存中的其他位置


即使在案例2中,您也不会在函数中更改
简单案例
的地址。您仅在
func_3
中更改指针的值。这是功能的局部变化。顺便说一句,这是内存泄漏。
malloc
分配的内存对调用函数不可见。因此,调用函数无法释放它。

撇开标准语言不谈,
lvalue
s和
rvalue
s

gibble
已经有地址了。你不能改变那个地址。您只能更改其值

只能更改指针的值,使其指向内存中的其他位置

即使在案例2中,您也不会在函数中更改
简单案例
的地址。您仅在
func_3
中更改指针的值。这是功能的局部变化。顺便说一句,这是内存泄漏。
malloc
分配的内存对调用函数不可见。因此,调用函数无法释放它。

func_3()
case2中,
gibble
main
simple\u Case
的地址开始。稍后,它将通过
malloc()
接受指针返回值。当然这里没有什么奇怪的,
gibble
是一个指针,它的值随着代码的进行而改变

在案例1中,代码尝试使用
&gibble=malloc()
更改变量的地址。变量的地址是不可更改的。请注意,如果变量被优化为仅作为处理器寄存器存在,则它甚至可能没有地址。

func\u 3()
case2中,
gibble
main
简单\u Case
的地址开始。稍后,它将通过
malloc()
接受指针返回值。当然这里没有什么奇怪的,
gibble
是一个指针,它的值随着代码的进行而改变


在案例1中,代码尝试使用
&gibble=malloc()
更改变量的地址。变量的地址是不可更改的。请注意,如果变量被优化为仅作为处理器寄存器存在,则它甚至可能没有地址。

,因为值的位置由编译器确定。这不是你可以通过指派或其他方式改变的事情
&gibble
是gibble
的位置。在相同的意义上,它是不可赋值的,
1=42不会将常量1的值更改为42。不可赋值等于说它不是l值

实际上,如果你住在贝克街1号,如果有人决定把你的地址改为贝克街2号,你的房子会自动跳到街对面,这是很愚蠢的。编译器只是用它自己奇特的方式告诉你这种愚蠢


另一方面,
gibble
是能够存储任何其他值的位置的位置的名称。(不完全是这样,但我们不会讨论内存对齐和C语义的细节。)因此赋值工作正常。

因为值的位置由编译器确定。这不是你可以通过指派或其他方式改变的事情
&gibble
是gibble
的位置。在相同的意义上,它是不可赋值的,
1=42不会将常量1的值更改为42。不可赋值等于说它不是l值

实际上,如果你住在贝克街1号,如果有人决定把你的地址改为贝克街2号,你的房子会自动跳到街对面,这是很愚蠢的。编译器只是用它自己奇特的方式告诉你这种愚蠢

另一方面,
gibble
是能够存储任何其他值的位置的位置的名称。(不完全是这样,但我们不会深入讨论内存对齐和C语义的细节。)因此赋值工作正常