为什么相同的结构体指针增量操作在不同代码有的编译正常,有的出现异常


为什么相同的结构体指针增量操作在不同代码有的编译正常,有的出现错误
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(错误:左值需要增量操作数),为什么这样子的呢,我看到这两个代码都一样呀,除了结构体赋值不同,但是为什么第二个会出现错误呢?

c语言 指针 程序开发

英俊的小帅哥 12 years, 9 months ago

第二个程序中,p->name 是数组名 你认为可以++吗??


数组名,虽然也能当指针使用,但是这个指针是个指针常量,不可变的;

++需要左值,所以错了。


另外,第一个程序,虽然编译和运行没有错误。

不过这种用法,是有问题的。

不管,这个指针是否左值,这个指针实际意义是,指向一个字符串,这个字符串,是一个名字。


做了++以后,他就不能指向,完整的字符串了。

如果其他地方,也用到这个指针,那么你只能得到这个名字的一部分,


那么程序就出错了。

这个程序就不正确了。


这种程序逻辑错误,最麻烦了。


PS:

如果只是研究一下,这么做没什么。


如果是在项目中,千万不能这么做。


secomd answered 12 years, 9 months ago

楼主第二个程序中的红色语句不合法是可以肯定的,p->name对应的是一个地址常量,不能认为是左值,固然不可以作为++的操作数了。。。

伪D芙蘭朵露、 answered 12 years, 9 months ago

Your Answer