【问题标题】:Char* copying to another char* runtime errorchar* 复制到另一个 char* 运行时错误
【发布时间】:2017-06-19 15:49:42
【问题描述】:

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

如果我能得到一些帮助,我将不胜感激。

const char *p="people";
char *q="random";
 while(*p)
{
    *q=*p;
    *p++;
    *q++;
}

【问题讨论】:

  • 您需要在编译器上打开警告。 char *q="random"; 至少应该是一个警告,实际上应该是一个错误。
  • char *q="random"; 指向另一个 const char* 并写入未定义的行为。

标签: c++ pointers char copy


【解决方案1】:

首先是行

char *q="random";

在 C++ 中不正确。如果您打开编译器的警告级别,您应该会收到一些警告。通过使用-Wallg++,我收到以下警告:

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

【讨论】:

  • 感谢您的宝贵时间,非常感谢您的帮助! :)
  • @PatrikTóth,不客气。请不要说我修复了一个错误。 *cp = '\n'; 行必须是 *cp = '\0';
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      “人”和“随机”都是通常分配在只读内存中的字符串。您的程序尝试覆盖只读的“随机”字符串。根据编译器和操作系统的不同,行为会有所不同。

      不要这样做!

      如果你使用一个数组作为“随机”,你会更好:

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

      或malloc

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

      【讨论】:

      • {"random"} -> "random"
      • 你作为参数传递给malloc的幻数7是什么?
      • 包含“随机”所需的字符串大小(6 + 1 表示“0”)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多