C++ 在遍历字符串时更改字符会使程序崩溃
可能重复: 有人能指出以下程序中的问题吗:C++ 在遍历字符串时更改字符会使程序崩溃,c++,macos,gcc,C++,Macos,Gcc,可能重复: 有人能指出以下程序中的问题吗: #include <stdio.h> int main() { char *c = "Hello World!! !!"; char c2 = 'X'; while(c) { if(*c == ' ') { printf("%s",c); *c = c2; } c++; } re
#include <stdio.h>
int main()
{
char *c = "Hello World!! !!";
char c2 = 'X';
while(c)
{
if(*c == ' ')
{
printf("%s",c);
*c = c2;
}
c++;
}
return 0;
}
我在MacOSX上将GCC用作编译器,将Eclipse用作IDE。在代码中,c指向字符串文字。第*c=c2行尝试修改字符串文字,即。未定义行为的一种可能表现形式是,字符串文本被放入只读内存中,您会得到一个或类似的值
如果您按以下方式更改代码,它应该可以工作:
char arr[] = "Hello World!! !!";
char* c = arr;
现在c指向一个数组。与字符串文字不同,允许修改数组的内容
最后,while循环的条件是指针的值,而不是指针指向的值。您正在查找空终止符“\0”。应该是这样的:
while (*c)
{
...
c++;
}
在代码中,c指向字符串文字。第*c=c2行尝试修改字符串文字,即。未定义行为的一种可能表现形式是,字符串文本被放入只读内存中,您会得到一个或类似的值
如果您按以下方式更改代码,它应该可以工作:
char arr[] = "Hello World!! !!";
char* c = arr;
现在c指向一个数组。与字符串文字不同,允许修改数组的内容
最后,while循环的条件是指针的值,而不是指针指向的值。您正在查找空终止符“\0”。应该是这样的:
while (*c)
{
...
c++;
}
当你这样做的时候:char*c=你好,世界!!;然后c是指向内存的指针
这在代码部分,所以您不能更改它
但是如果你有字符c[]=你好,世界!!;然后c是堆栈上的字符数组,因此您可以更改它
在这种情况下,最好这样做:char const*c=Hello World!!;因为这样,如果您在进行更改时尝试更改字符串,您的程序将不会崩溃,它将出现编译器错误,并且不会运行程序,这会更好。当您这样做时:char*c=Hello World!!;然后c是指向内存的指针
这在代码部分,所以您不能更改它
但是如果你有字符c[]=你好,世界!!;然后c是堆栈上的字符数组,因此您可以更改它
在这种情况下,最好这样做:char const*c=Hello World!!;因为这样,如果您尝试在执行操作时更改字符串,您的程序不会崩溃,它将出现编译器错误,并且不会运行程序,这会更好。@NPE请保留指向未定义行为维基页面的链接…@NPE请保留指向未定义行为维基页面的链接。。。