首先是行
char *q="random";
在 C++ 中不正确。如果您打开编译器的警告级别,您应该会收到一些警告。通过使用-Wall 和g++,我收到以下警告:
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char *q="random";
不能修改q点的内容。修改 q 指向的内容会导致未定义的行为。
你需要做的是创建一个char的数组并修改数组的内容。
char q[] = "random";
这允许您修改q 的内容。但是,如果将q 定义为数组,则不能使用++q 或q++。您将需要使用另一个变量来迭代数组。
其次,取消引用下面几行的指针似乎向我表明您不确定发生了什么。
*p++;
*q++;
由于运算符优先级,它们等价于:
*(p++);
*(q++);
指针递增,然后取消引用,但不使用取消引用的值。再一次,通过提高警告级别,您可以发现此类问题。我收到g++ -Wall 的以下警告。
warning: value computed is not used [-Wunused-value]
*p++;
warning: value computed is not used [-Wunused-value]
*q++;
您可以只增加指针而不尝试取消引用它们。
这是适用于我的程序的更新版本。
int main()
{
const char *p="people";
char q[] = "random";
char *cp = q;
while(*p)
{
*cp = *p;
p++;
cp++;
}
}
警告
变量q的定义在上述程序中是脆弱的。巧合的是,字符串"people" 的长度等于字符串"random" 的长度。如果您要将p 更改为。
const char *p="a large number of people";
程序将中断,因为q 没有足够的空间容纳这么大的字符串。
为了安全起见,您必须使用动态内存分配。
#include <cstring>
int main()
{
const char *p="a large number fo people";
char* q = new char[std::strlen(p)+1];
char *cp = q;
while(*p)
{
*cp = *p;
p++;
cp++;
}
*cp = '\0';
// Use q
// ...
//
// Release dynamically allocated memory.
delete [] q;
}