我想知道为什么第一个语句有效,为什么不用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)
这是错误的,因为我们无法为数字分配内容.
小智 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中.