将malloc输出分配给地址?左值误差
为什么不能将malloc输出分配给结构的地址 案例1 这会产生左值错误:将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
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语义的细节。)因此赋值工作正常