2

可能重复:
通过指针更改 C 中的字符串文字?

这是一个代码示例

void main()  
{

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

谁能告诉我为什么这段代码在 gcc 中出现分段错误,而我猜它应该给出“q”。当我只使用*i++它给我结果但只使用预增量时,它给我一个分段错误。

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

4

3 回答 3

7

++*i意味着++(*i)。您正在尝试修改字符串文字的第一个字符,这是不允许的。就 C 标准而言,行为是未定义的,但此实现有助于提醒您注意该问题。

*i++意味着*(i++)。您正在修改您的指针i,这很好。

void main()不是编写main函数的正确方法,因为标准说main返回int. 返回值用于指示程序的成功或失败。实现可以支持其他形式的main,但有两种是必需的:int main(void)int main(int argc, char *argv[]).

于 2012-09-28T18:29:03.503 回答
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 代码。

于 2012-09-28T18:42:59.267 回答
0
++*i

意味着你预先增加你的指针。例如

int *i

*i = 1;

假设 i 是指向地址的指针,0x8FF43FF0 如果您++*i在取消引用i指向之前进行编译0x8FF43F4

++(*i)

意味着,首先取消引用i,而不是增量

于 2012-09-28T18:40:43.937 回答