可能重复:
通过指针更改 C 中的字符串文字?
这是一个代码示例
void main()
{
char *i="prady"; printf("%c ",++*i);
}
谁能告诉我为什么这段代码在 gcc 中出现分段错误,而我猜它应该给出“q”。当我只使用*i++
它给我结果但只使用预增量时,它给我一个分段错误。
还告诉我为什么 void main 不是编写main()
函数的正确方法。
可能重复:
通过指针更改 C 中的字符串文字?
这是一个代码示例
void main()
{
char *i="prady"; printf("%c ",++*i);
}
谁能告诉我为什么这段代码在 gcc 中出现分段错误,而我猜它应该给出“q”。当我只使用*i++
它给我结果但只使用预增量时,它给我一个分段错误。
还告诉我为什么 void main 不是编写main()
函数的正确方法。
++*i
意味着++(*i)
。您正在尝试修改字符串文字的第一个字符,这是不允许的。就 C 标准而言,行为是未定义的,但此实现有助于提醒您注意该问题。
*i++
意味着*(i++)
。您正在修改您的指针i
,这很好。
void main()
不是编写main
函数的正确方法,因为标准说main
返回int
. 返回值用于指示程序的成功或失败。实现可以支持其他形式的main
,但有两种是必需的:int main(void)
和int main(int argc, char *argv[])
.
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 代码。
++*i
意味着你预先增加你的指针。例如
int *i
*i = 1;
假设 i 是指向地址的指针,0x8FF43FF0
如果您++*i
在取消引用i
指向之前进行编译0x8FF43F4
++(*i)
意味着,首先取消引用i
,而不是增量