You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言技术问询:str="Hello"与char* str1="Hello"是否为字符串拷贝?原因解析

问题1:对于C语言程序员,语句str="Hello"是否表示字符串拷贝?背后的原因是什么?

这绝对是C语言新手最容易踩的坑之一!直接给结论:这完全不是字符串拷贝操作。

得从C语言的字符串本质说起——C语言根本没有原生的“字符串类型”,我们平时说的字符串,要么是char数组,要么是指向char的指针。而"Hello"这种写法是字符串字面量,它在程序编译阶段就会被存放到内存的只读数据段里,本质上是一个指向该字符串首字符'H'的const char*指针。

那str = "Hello"到底做了什么?

  • 如果str是一个char*类型的指针变量:这个语句只是把只读数据段中"Hello"的首地址赋值给str,让str指向这个字面量的起始位置,没有任何字符被复制。
  • 如果str是一个char数组(比如char str[10];):这个语句本身是非法的!因为数组名是一个常量指针,不能被赋值,编译器会直接报错。
问题2:针对代码片段char *str1; str1 = "Hello";,其中str1 = "Hello";是否表示字符串拷贝?原因是什么?

答案还是一样:不是字符串拷贝。

拆解一下细节:str1是一个char*类型的指针变量,它一开始是未初始化的(指向随机地址)。而str1 = "Hello"这个操作,只是把字符串字面量"Hello"在只读数据段的首地址赋值给str1,让str1指向这个只读的字符串。整个过程没有任何字符被复制,只是指针的指向发生了变化。

这里要特别提醒:因为字符串字面量存放在只读区域,如果你之后尝试修改str1指向的内容(比如str1[0] = 'h';),会触发未定义行为——程序可能崩溃,也可能出现奇怪的结果,绝对不能这么干。

如果真的要做字符串拷贝,你得用标准库的strcpy()函数(或者更安全的strncpy()),前提是目标内存有足够的空间。比如:

char str1[10]; // 先分配足够的数组空间
strcpy(str1, "Hello"); // 这才是真正把"Hello"的字符复制到str1数组里

内容的提问来源于stack exchange,提问作者Shoheb Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:33:18