这是一个代码示例
void main()
{
char *i="prady"; printf("%c ",++*i);
}
有人能告诉我为什么这段代码在gcc中给出了一个分段错误,我猜它应该给'q'。当我只使用*i++
时,它会给我结果但是只有预先递增才会给我一个分段错误。
还告诉我为什么void main不是写main()
函数的正确方法。
答案 0 :(得分:7)
++*i
表示++(*i)
。您正在尝试修改字符串文字的第一个字符,这是不允许的。就C标准而言,行为是未定义的,但是这种实现方式有助于提醒您解决问题。
*i++
表示*(i++)
。你正在修改你的指针i
,这很好。
void main()
不是编写main
函数的正确方法,因为标准表示main
返回int
。返回值用于指示程序的成功或失败。实现可以支持其他形式的main
,但有两个是必需的:int main(void)
和int main(int argc, char *argv[])
。
答案 1 :(得分:0)
++*i
表示您预先增加指针。例如
int *i
*i = 1;
想象我是指向地址0x8FF43FF0
的指针
如果您在解除引用++*i
指向i
0x8FF43F4
++(*i)
表示首先取消引用i
,而不是增量
答案 2 :(得分:0)
Steve Jessop已经告诉过你为什么++ * i会返回一个错误,所以我不会再告诉你了。
* i ++将返回p,即单词的第一个字母,因为“++”运算符首先返回该值,并且只有在返回值之后才会增加它。
因此,如果您希望程序打印“q”,则必须说printf("%c ",*i+1)
。
此外,如果您希望程序打印第二个字符,请尝试:printf("%c ", *(i+1))
。在你的单词的第三个字母后面的字母表中的下一个字母将是printf("%c ", *(i+2)+1)
,依此类推。
为什么你应该使用int main而不是void? main函数返回的值通知操作系统程序如何结束。 o(如返回0)告诉操作系统程序已正确执行。当程序因错误而必须结束时,通常使用非0代码。