考虑一个典型的环境,为什么下面的代码在 C 中是非法的?
{
int x;
&x = (int*) malloc(3*sizeof(int));
...
}
你不能给地址分配一些东西,x
因为他的地址x
不是左值
(Anlvalue
是“可以分配给的东西”,即它不能在等号的左侧)
尝试
int* x;
x = (int*) malloc(3*sizeof(int)); // TODO: Call free(x)
现在x
指向您分配的内存,您可以执行以下操作
int foo = *x;
int bar = x[0];
您可以通过以下方式使用运算符将地址分配x
给&
其他内容:
int x = 1;
int* y = &x; // y now holds the address of x
*y = 2; // Now x = 2
因为 x 的地址不是左值 - 它不是可以修改的东西。C 允许您更改地址指向的内容 - 它不允许您更改地址本身。
每个人都是正确的。代码执行时 X 的地址是一个常数。换句话说,它说“嘿,你可以改变我,编译器,存储'x'变量的位置。”
你可以这样做
int main()
{
int* x;
*(&x) = malloc(3*sizeof(int));
}
变量的地址不能更改。相反,您很可能想要这样的东西:
int *x = (int *)malloc(3 * sizeof(int));
...
free(x);
并不是说这完全有价值,但由于没有其他人提出它(上述所有答案都是正确的,顺便说一句,而且是多余的,我同意人们应该投票给正确的答案,而不是一遍又一遍地说同样的话)。
在您的示例中, x 是一个堆栈变量。malloc 为您提供堆内存。在今天的编程中,这可能不是您需要考虑太多的事情,但是如果您曾经在内存非常宝贵的环境中工作,您将希望尽可能地节省您的堆栈。
还值得注意的是,由于某种原因,您分配了 3*sizeof(int)。即使您可以为堆栈分配内存,在您的示例中,由于您只尝试获取 1 个 int,您只需要 1* sizeof(int),其余部分将被浪费。
&x 返回指向 x 的指针。您不能在作业的左侧使用它,只能在右侧使用它。
如果你想给一个指针赋值,你必须把它声明为一个指针,就像int *x;
这就是语言的设计方式。要执行您想要的操作,请使用指针。