为什么以下C代码非法?

时间:2009-03-13 00:47:49

标签: c pointers addressof

考虑一个典型的环境,为什么下面的代码在C中是非法的?

{
int x;
&x = (int*) malloc(3*sizeof(int));
...
}

7 个答案:

答案 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)

这就是语言的设计方式。要做你想做的事,请使用指针。