[英]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.