Char *复制到另一个char *运行时错误

时间:2017-06-19 15:49:43

标签: c++ pointers char copy

当我尝试运行后续代码时,它停止工作,我不明白为什么。

如果我能得到一些帮助,我会很感激。

twine

4 个答案:

答案 0 :(得分:1)

char *分配给字符串文字(char *q="random";)时,指针指向"只读"数据,因此任何试图修改(*q = ...)的操作都不会像未预期的行为那样工作

答案 1 :(得分:1)

首先,行

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定义为数组,则无法使用++qq++。您将需要使用另一个变量来迭代数组。

其次,取消引用指针下面的行似乎向我表明你不确定发生了什么。

*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;
}

答案 2 :(得分:0)

您的代码char*复制到char*;它正在将char数组复制到char数组。而且它复制到的数组是不可修改的。

答案 3 :(得分:0)

两者,&#34;人和#34;和&#34;随机&#34;是通常在只读内存中分配的字符串。你的程序试图写入只读的随机&#39;串。根据编译器和操作系统的不同,行为也会有所不同。

不要这样做!

如果您使用数组进行随机播放,那就更好了:

char random[] = {"random"};
char *q = random;

或malloc

char *q = (char*)malloc(7);
strcpy(q, "random");