字符* 复制到另一个字符* 运行时错误
Char* copying to another char* runtime error
当我尝试运行 folling 代码时,它停止工作,我不明白为什么。
如果我能得到一些帮助,我将不胜感激。
const char *p="people";
char *q="random";
while(*p)
{
*q=*p;
*p++;
*q++;
}
首先,这条线
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 = ' ';
// Use q
// ...
//
// Release dynamically allocated memory.
delete [] q;
}
当将char *
分配给字符串文字(char *q="random";
)时,指针被定向到"只读"数据,因此任何试图修改(*q = ...
)的操作都不会按预期工作,因为它未定义的行为
你的代码不是将char*
复制到char*
;而是将char
数组复制到char
数组。而且它要复制到的数组是不可修改的。
"people"和"random"都是通常在只读存储器中分配的字符串。程序尝试重写只读的"随机"字符串。根据编译器和操作系统的不同,行为会有所不同。
不要这样做!
如果你使用一个数组来表示"随机"会更好:
char random[] = {"random"};
char *q = random;
或马洛克
char *q = (char*)malloc(7);
strcpy(q, "random");
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 为什么当 vector 为空时会显示运行时错误?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 运行时错误:矢量下标超出范围:正在检查空集
- 分配给gslice_array会导致运行时错误
- cout 新创建的对象引发运行时错误
- C++在使用std::multimap时出现运行时错误的几率很小
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 字符* 复制到另一个字符* 运行时错误
- 为什么它会导致运行时错误,字符到整数而不初始化
- 检查平衡分组字符时出现在线判断运行时错误