为什么相同的结构体指针增量操作在不同代码有的编译正常,有的出现异常
为什么相同的结构体指针增量操作在不同代码有的编译正常,有的出现错误
1.
#include <stdio.h>
int main()
{
struct student{<br />
char * name;<br />
int score;<br />
};<br />
struct student st={"Brian",97};
struct student *ptr=&st;
printf("ptr->name=%s\n",ptr->name);<br />
printf("*ptr->name=%c\n",*ptr->name);<br />
printf("*ptr->name++=%c\n",*ptr->name++);<br />
printf("*ptr->name=%c\n",*ptr->name);<br />
/*
printf("ptr->score=%d\n",ptr->score);<br />
printf("ptr->score++=%d\n",ptr->score++);<br />
printf("ptr->score=%d\n",ptr->score); <br />
*/
return 0;
}
2.
#include <stdio.h>
int main()
{
struct student{<br />
char name[89];<br />
int score;<br />
};<br />
struct student st={"hello",79};
struct student *p;
p=&st;<br />
printf("p->name=%s\n",p->name);
printf("p->name=%c\n",p->name);
printf("p->name++=%c\n",p->name++);
return 0;
}
两个程序,但是红色标注的那一行的代码在第一个程序中正常,但是在第二个代码中就显示错误:error: lvalue required as increment operand(错误:左值需要增量操作数),为什么这样子的呢,我看到这两个代码都一样呀,除了结构体赋值不同,但是为什么第二个会出现错误呢?
Answers
第二个程序中,p->name 是数组名 你认为可以++吗??
数组名,虽然也能当指针使用,但是这个指针是个指针常量,不可变的;
++需要左值,所以错了。
另外,第一个程序,虽然编译和运行没有错误。
不过这种用法,是有问题的。
不管,这个指针是否左值,这个指针实际意义是,指向一个字符串,这个字符串,是一个名字。
做了++以后,他就不能指向,完整的字符串了。
如果其他地方,也用到这个指针,那么你只能得到这个名字的一部分,
那么程序就出错了。
这个程序就不正确了。
这种程序逻辑错误,最麻烦了。
PS:
如果只是研究一下,这么做没什么。
如果是在项目中,千万不能这么做。