这段代码至少存在三个问题(也许更多;我不是 C++ 专家)。
第一个问题是不应修改字符串常量,因为它们可以放置在程序内存的只读部分中,操作系统直接映射到磁盘上的 exe 文件(操作系统可能在相同的几个运行实例之间共享它们例如程序,或者避免在 RAM 低时将那些需要写入交换文件的内存部分,因为它知道它可以从 exe 中获取原始文件)。例如,该示例在我的编译器上崩溃。要修改字符串,您应该分配字符串的可修改副本,例如使用strdup。
第二个问题是它在没有声明的情况下使用cout
和endl
来自命名空间。std
您应该为他们的访问添加前缀std::
或添加using namespace std;
声明。
第三个问题是第二行上的操作发生的顺序cout
是未定义的行为,导致字符串在第一行末尾cout
和下一行显示的时间之间发生了明显的神秘变化。
由于此代码不打算做任何特别的事情,因此您可以使用不同的有效方法来修复它。这可能会运行:
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
int main()
{
char *string = strdup("School");
char *p = string;
char c;
c=++(*(p++));
cout<<c<<","<<p<<endl;
cout<<p<<","<<++(*(p--))<<","<<++(*(p++))<<endl;
free(string);
}
(在我的编译器上输出:T,chool
,diool,i,d
。)
它仍然有未定义的行为。cout
要解决此问题,请按如下方式修改第二行:
cout << p << ",";
cout << ++(*(p--)) << ",";
cout << ++(*(p++)) << endl;
那应该给出T,chool
, chool,d,U
(假设一个字符集按顺序从 A 到 Z)。