增量运算符给出分段错误?

时间:2012-09-28 18:26:54

标签: c

  

可能重复:
  Change string literal in C through pointer?

这是一个代码示例

void main()  
{

    char *i="prady";  printf("%c ",++*i); 
}

有人能告诉我为什么这段代码在gcc中给出了一个分段错误,我猜它应该给'q'。当我只使用*i++时,它会给我结果但是只有预先递增才会给我一个分段错误。

还告诉我为什么void main不是写main()函数的正确方法。

3 个答案:

答案 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代码。