<分区>
为什么我运行这个程序没有输出。
#include<stdio.h>
int main()
{
char* t="C++";
t[1]='p';
t[2]='p';
printf("%s",t);
return 0;
}
标签 c
<分区>
为什么我运行这个程序没有输出。
#include<stdio.h>
int main()
{
char* t="C++";
t[1]='p';
t[2]='p';
printf("%s",t);
return 0;
}
最佳答案
C 字符串文字创建一个匿名数组 char
.任何修改该数组的尝试都具有未定义的行为。理想情况下,这将通过制作数组 const
来强制执行。 , 但 C 并不总是有 const
,并将其添加到字符串文字中会破坏现有代码。
char* t="C++";
这是合法的,但有潜在风险。包含字符 'C', '+', '+', '\0'
的数组可以存储在读写内存或只读内存中,由编译器决定。
t[1]='p';
这里您的程序的行为是未定义的,因为您正试图修改字符串文字的内容。编译器不需要就此向您发出警告,无论是在编译时还是在运行时——也不需要做任何事情来让它“工作”。
如果想让编译器知道这个字符串是只读的,最好加上const
限定自己:
const char *t = "C++";
如果您尝试修改字符串文字,编译器至少应该警告您——至少如果您尝试通过 t
这样做.
如果你想修改它,你应该制作t
一个可写数组:
char t[] = "C++";
而不是制作 t
指向 "C++"
开头的指针,这使得 t
一个数组,其中 "C++"
的内容被复制。你可以用t
的内容做你喜欢的事。 ,只要您不超出其范围即可。
对您的代码的一些评论:
#include<conio.h>
<conio.h>
特定于 Windows(和 MS-DOS)。如果您不需要您的程序在任何其他系统上运行,那很好。如果您希望它便于携带,请将其移除。
void main()
这是错误的;正确的声明是 int main(void)
(int main()
在 C 中是有问题的,但在 C++ 中是正确的。)
printf("%s",t);
您的输出应以换行符结尾;如果不这样做,可能会发生各种不好的事情。做这个:
printf("%s\n", t);
(问题最初包括在结束前的这一行 }
:
getch();
OP 后来删除了它。这是特定于 Windows 的。可能有必要在程序完成时防止输出窗口关闭,这是 Windows 开发系统的一个不幸问题。如果你想要一个更标准的方法来做到这一点,getchar()
只需从标准输入中读取一个字符,然后让您按 Enter 完成(尽管它不会给您提示)。或者,如果您从 IDE 或命令提示符运行程序,它们中的大多数不会立即关闭窗口。)
最后,由于 main
返回 int
类型的结果,它实际上应该这样做;你可以添加
return 0;
收盘前}
.这并不是真正必需的,但这不是一个坏主意。 (C99 加了一个隐含的 return 0;
,但微软不支持 C99。)(2019 年更新:微软对 C99 特性的支持稍微好一些,我不确定是否需要 return 0;
。)
关于c - 修改字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464183/