如何复制const char*类型变量的内容

How to copy contents of the const char* type variable?

本文关键字:类型变量 char const 何复制 复制      更新时间:2023-10-16

我知道之间的区别

char *a = "string";
char p[] = "string";

*a开始,它的作用如下。。。

     +-----+     +---+---+---+---+---+---+---+ 
  a: |  *======> | s | t | r | i | n | g | |    
     +-----+     +---+---+---+---+---+---+---+ 

如果我想创建另一个变量,比如

char *b;

我希望它复制a指向的指针中的所有内容,而不是指向a的内容。

     +-----+     +---+---+---+---+---+---+---+      
  a: |  *======> | s | t | r | i | n | g | |    
     +-----+     +---+---+---+---+---+---+---+ 
  b: |  *======> | s | t | r | i | n | g | |    
     +-----+     +---+---+---+---+---+---+---+ 

如何做到这一点?

在C++中,您可以执行

const size_t n = strlen(a);   // excludes null terminator
char *b = new char[n + 1]{};  // {} zero initializes array
std::copy_n(a, n, b);

实际示例

但是,我建议使用std::string而不是C样式字符串,因为它是

  • 正确处理-嵌入字符串
  • 安全的
  • 易于使用

在C中,您可以分配一个新的缓冲区b,然后使用标准库函数将字符串复制到那里,如下所示:

b = malloc((strlen(a) + 1) * sizeof(char));
strcpy(b,a);

注意malloc中的+1,以便为终止的''腾出空间。sizeof(char)是多余的,但我使用它是为了保持一致性。

在C++中,应该使用更安全、更优雅的std::string:

std::string b {a};

a的内容,正如您发布的那样,指向编译器设置的只读内存位置。如果你想在编译时有另一个具有不同值的,你必须自己定义一个:

char *a = "string";
char *b = "string"; // Nb. This might point to the same location as a

注意,根据§2.14.5,这两个指针是否指向相同的内存位置是实现定义的

是否所有字符串文字都是不同的(即存储在不重叠的对象中)取决于实现。

否则,请选择堆存储位置,如:

size_t len = strlen(a); // Doesn't include null-terminator character
char *b = new char[len+1];
memcpy(b, a, len); // Assumes plain ASCII string
b[len] = '';

无论如何,我都会选择std::string

您可以使用<string.h>:中的非标准(但在许多实现中可用)strdup函数

char *b;
strdup(b, a);
...
free(b);

或者您可以使用malloc然后使用strcpy:来预留空间

char *b;
b = malloc(strlen(a) + 1);
strcpy(b, a);
...
free(b);

a的内容就是您在图中标记为*的内容。a是你的小盒子,a的内容就是盒子里的东西!

"字符串"不是a的内容。它在内存中的其他地方,a包含该字符串的地址。

a的内容复制到b最终会执行以下操作:

   +-----+     +---+---+---+---+---+---+---+      
a: |  *======> | s | t | r | i | n | g | |    
   +-----+  /  +---+---+---+---+---+---+---+ 
b: |  *====/
   +-----+     

为了实现您在第二张图中绘制的内容,您需要复制a所指向的所有数据。这并不简单,因为您如何决定何时停止复制?没有通用的方法,但如果您预先确定只想复制一个字符串,那么您可以使用一个复制字符串的函数。

常见但非标准的strdup函数将分配新的空间并复制字符串。否则,您可以分配空间(以C中分配空间的任何常见方式),然后将字符串复制到分配的空间中。