3

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

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

7 回答 7

31

你不能给地址分配一些东西,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
于 2009-03-13T00:49:31.373 回答
11

因为 x 的地址不是左值 - 它不是可以修改的东西。C 允许您更改地址指向的内容 - 它不允许您更改地址本身。

于 2009-03-13T00:50:01.887 回答
3

每个人都是正确的。代码执行时 X 的地址是一个常数。换句话说,它说“嘿,你可以改变我,编译器,存储'x'变量的位置。”

你可以这样做

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

}
于 2009-03-13T01:00:07.853 回答
2

变量的地址不能更改。相反,您很可能想要这样的东西:

int *x = (int *)malloc(3 * sizeof(int));
...
free(x);
于 2009-03-13T00:49:40.000 回答
1

并不是说这完全有价值,但由于没有其他人提出它(上述所有答案都是正确的,顺便说一句,而且是多余的,我同意人们应该投票给正确的答案,而不是一遍又一遍地说同样的话)。

在您的示例中, x 是一个堆栈变量。malloc 为您提供堆内存。在今天的编程中,这可能不是您需要考虑太多的事情,但是如果您曾经在内存非常宝贵的环境中工作,您将希望尽可能地节省您的堆栈。

还值得注意的是,由于某种原因,您分配了 3*sizeof(int)。即使您可以为堆栈分配内存,在您的示例中,由于您只尝试获取 1 个 int,您只需要 1* sizeof(int),其余部分将被浪费。

于 2009-03-13T01:46:31.907 回答
1

&x 返回指向 x 的指针。您不能在作业的左侧使用它,只能在右侧使用它。

如果你想给一个指针赋值,你必须把它声明为一个指针,就像int *x;

于 2009-03-13T00:52:16.950 回答
0

这就是语言的设计方式。要执行您想要的操作,请使用指针。

于 2009-03-13T00:49:54.650 回答