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