【发布时间】:2012-06-10 16:45:18
【问题描述】:
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char *b=(char*)malloc(sizeof(char)*50);
b=(char*)"hello world";
// works
char a[50];
a=(char*)"hello world";
//doesn't work. why? I thought array names are just pointers that point
//to the first element of the array (which is char). so isn't a char*?
return 0;
}
我认为它不起作用的原因是没有一个名为“a”的变量实际上存储了一个 char* 值。那么'a'应该被认为是一个右值吗?我不确定我是否正确理解了这个概念
【问题讨论】:
-
命名对象始终是左值。
-
数组不是指针,但您似乎正在尝试使用它。
-
对这些事情(以及更多)有非常透彻的解释here。
-
请注意,您的第一个示例可以编译,但它不能“工作”!它不会将“hello world”复制到分配的空间中,它只是将
b更改为指向“hello world”字符串。 -
警告:标签会影响答案。例如,Als 回答 C 时,他说将数组名称传递给函数会导致指针衰减(在 C++ 中,对于采用数组引用的函数来说,它不会)。但“右值”是 C++ 中的一个术语,而不是 C 中的一个术语,它表示“表达式的值”。