繁体   English   中英

为什么以下C代码是非法的?

[英]Why is the following C code illegal?

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

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

您不能为x的地址分配任何内容,因为他的x地址不是左值

(一个lvalue是“的东西,可以被分配给”,即,它不能是对的一个为L EFT侧等号)

尝试

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返回指向x的指针。 您不能在作业的左侧使用它,而只能在右侧使用。

如果要为指针分配某些内容,则必须将其声明为指针,就像int * x;一样

并不是说这是完全有价值的,而是因为没有其他人提出来(上述所有答案都是正确,顺带和多余的,我同意人们应该投票赞成正确的答案,而不是一遍又一遍地讲同一句话)。

在您的示例中,x是一个堆栈变量。 malloc给您堆内存。 在当今的编程中,这可能不需要太多考虑,但是如果您在内存非常宝贵的环境中工作,则将需要尽可能多地节省堆栈。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM