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

时间:2015-04-13 03:42:01

标签: 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(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;
}

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

3 个答案:

答案 0 :(得分:3)

暂不使用标准语言,该标准涉及lvaluervalue s ...

gibble已有地址。您无法更改该地址。您只能更改其值。

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

即使在案例2 中,您也不会更改函数中simple_Case的地址。您只是在func_3中更改指针的值。这是函数的局部变化。这是一个内存泄漏,BTW。由malloc分配的内存对于调用函数是不可见的。因此,调用函数无法释放它。

答案 1 :(得分:1)

func_3() case2中,gibblemain的{​​{1}}地址开头。稍后它会使simple_Case返回指针的值。当然没什么奇怪的,malloc()是一个指针,它的随着代码的进行而改变。

在case1中,代码尝试使用gibble更改变量的地址。变量的地址不可更改。请注意,如果变量被优化为仅作为处理器的寄存器存在,则该变量甚至可能没有地址。

答案 2 :(得分:1)

因为值的位置由编译器确定。这不是你通过转让或任何其他方式改变的东西。 &gibblegibble的位置。它不能以1 = 42;不会将常数1的值更改为42的相同意义分配。不可分配与说它不是l值相同。

实际上,如果你住在1 Baker St.,如果有人决定将你的地址指定为2 Baker St.,那么认为你的房子会自发地在街对面跳跃是愚蠢的。编译器只是以自己古怪的方式告诉你这种愚蠢。

另一方面,gibble是能够存储任何其他值的位置的位置的名称。 (嗯,不完全是,但我们不会进入内存对齐和C语义的尼特。)所以赋值工作正常。