【问题标题】:Copy char* in C在 C 中复制 char*
【发布时间】:2018-01-15 23:59:21
【问题描述】:

为什么这个函数会起作用?
我认为这不是在 C 中复制 char* 的正确方法。

#include <stdio.h>

int main() {

    const char* original = "TEST";
    char* copy;
    copy = original;

    printf("%s\n", original);
    printf("%x\n", &original);
    printf("%s\n", copy);
    printf("%x\n", &copy);

    return 0;
}

【问题讨论】:

  • copy = original; 是一个错误,因为在没有强制转换的情况下丢弃了 const 限定符。如果您没有看到错误消息,请重新配置您的编译器,以便出现错误消息。
  • 请拨打tour 并学习如何进行研究。特别是,看看其他人是否问过类似的问题:stackoverflow.com/search?q=%5Bc%5Dcopy+string
  • 学习语言并专门阅读有关指针的信息,char * 是指针,您不是在创建副本,而是指向原始文本,它也是指向文本“TEST”的指针。 original 是一个 const 指针,这意味着您不能重新分配它。副本可以移动。

标签: c pointers char


【解决方案1】:

它不复制字符串。您只需将指针copy 分配给字符串文字的地址,该地址也存储在original 指针中。两者都指向内存中的同一个地方,但类型不同。

【讨论】:

  • @PeterJ-01 谢谢老兄。
  • 如果它提供了如何实际复制字符串的线索,这将是一个更好的答案。
  • 不一定是字符串。他的问题是关于指针和常量(在这种情况下为 char []literals)
【解决方案2】:

不,您不是在复制字符串,而是通过 指针。

如果你想复制一个字符串,你必须使用strcpy

man strcpy

#include <string.h>
char *strcpy(char *dest, const char *src);

strcpy() 函数复制src 指向的字符串,包括终止符 空字节 ('\0'),指向dest 指向的缓冲区。弦不能重叠, 并且目标字符串 dest 必须足够大以接收副本。 小心缓冲区溢出!

这会复制一个字符串。

const char *original = "TEST";
char copy[20];
strcpy(copy, original);

这只是变量赋值。

const char* original = "TEST";
char* copy;
copy = original;

original 指向字符串"TEST" 的开头,这是一个字符串字面量 因此指向只读存储器。这就是为什么变量的类型是 const char*。这告诉你你不能修改指向的内容 指针。但是,您可以将位置更改为它指向的位置。

const char* original = "TEST";
original = "TEST1";  // OK
original[0] = 't';   // NOT OK

printfs:

printf("%s\n", original);

打印original指向的字符串

printf("%x\n", &original);

以十六进制格式打印变量original 的数字地址。 请注意,这不是original 指向的位置,而是original 所在的位置 存储。

printf("%s\n", copy);

Sams 作为第一个不同的变量,但指向相同的位置,因此 结果是一样的。

printf("%x\n", &copy);

和第二个一样,不过这次copy变量的地址是 打印出来的。

注意,如果你想用printf 打印一个变量的地址,你 应该使用"%p" 转换说明符。

【讨论】:

  • ` char *src = "你好"; char *dst = "World1"; strcpy(dst,src) ` 出现分段错误,为什么?
  • @Zzz0_o 因为dst 指向只读内存,因此当您尝试在只读位置写入时它会崩溃。 char *src = "Hello"; char dst[] = "World"; strcpy(dst, src); 会工作。但是请记住,strcpy 不是一种安全的方法,您应该始终使用strncpy
  • 还请记住,字符串文字本质上几乎总是 const。您实际上应该将它们声明为 const,如下所示:const char *str = "This is the correct way";
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多