将字符串分配给char数组

Iqb*_*han 21 c++

我想知道为什么第一个语句有效,为什么不用c ++中的第二个语句

char a[10]="iqbal";  // it works

a="iqbal"; // does not work 
Run Code Online (Sandbox Code Playgroud)

Pav*_*ath 23

严格来说,数组不是指针!并且数组(数组的基地址)不能是可修改的左值.即,它不能出现在赋值运算符的左侧.仅在某些情况下才会将衰减变为指针.阅读此SO帖子,了解数组何时衰减为指针.这是一篇更好的文章,它解释了数组和指针之间的差异

还可以阅读关于左值和右值的信息,以便了解LHS上不会出现的事物=

char a [10] ="iqbal"; // 有用

在这种情况下,内部发生的是

a[0] = 'i';
a[1] = 'q'; 
 .
 .
a[5] = '\0';
Run Code Online (Sandbox Code Playgroud)

所以一切都很好,因为array[i]可改变的左值.

一个="伊克巴尔"; //不起作用

在内部,这大致相当于

0x60000(Address of a, but is a simple number here ) = Address of "iqbal"
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为我们无法为数字分配内容.

  • 实际上,`a`是一个可修改的左值,但不能出现在赋值运算符的左侧.lvalue和rvalue中l和r的含义很久以前就失去了. (2认同)

小智 5

char数组a将是静态的,如果您像这样初始化它,则无法更改.无论如何,你永远不能在c中分配字符串a ="iqbal".你必须使用strncpy或memcpy.否则你将尝试覆盖指向字符串的指针,这不是你想要的.

所以正确的代码会做类似的事情:

char a[10];
strncpy(a, "iqbal", sizeof(a) - 1);
a[sizeof(a) - 1] = 0;
Run Code Online (Sandbox Code Playgroud)

-1是为终止零保留一个字节.注意,如果字符串为null,则必须自行检查.坏api.有一个strlcpy()调用为你做这个,但它不包含在glibc中.