C语言指针基础:常量指针与字符串字面量修改风险

方予
方予
发布时间:2026-10-14| 4人浏览过
原创

在C/C++开发中,常有人混淆“常量指针”与“指针常量”,导致内存操作错误。本文将厘清两者核心差异,并重点剖析直接修改字符串字面量这一常见误区,提供安全且符合标准的实践建议。

常量指针 vs 指针常量

“常量指针”和“指针常量”名字相近,但修饰关系截然不同,理解的关键在于阅读顺序:从变量名向两侧阅读,const修饰谁,谁就不可变。

第一步:掌握常量指针(Pointer to Const)

定义:指向常量对象的指针。
语法示例:

const char *st = "str";
// 或者
char const *st = "str";
特性分析:
1. 指向内容不可修改:由于指针指向的是常量数据,尝试通过解引用修改值会导致编译错误或运行时异常。例如:
*st = 'n'; // 错误:试图修改只读内存中的常量
2. 指向位置可变:指针本身不是常量,可以改变其指向的地址。例如:
st = "ok"; // 正确:指针指向了另一个新的字符串常量地址
完成状态判断:代码能成功编译,且仅限制了对*st的写入操作。

第二步:掌握指针常量(Const Pointer)

定义:本身为常量的指针,通常指向可变对象。
语法示例:

char *const st = "str";
特性分析:
1. 指向位置不可变:指针一旦初始化,必须固定指向某个地址,不能更改。例如:
st = "no"; // 错误:试图改变常量指针的指向
2. 指向内容可修改:理论上,如果该指针指向的是普通变量而非常量,则可以通过指针修改内容。
注意:在初始化时若赋值为字符串字面量(如上面的例子),虽然语法上允许编译(因历史兼容性),但在实际运行中修改*st仍会触发段错误,因为底层仍是只读内存。

字符串字面量的只读性与修改风险

在实际编码中,最常见的错误是试图修改字符串字面量。以下代码展示了典型的错误用法:

char *s = "abcde";
s[0] = '1'; // 运行时出错(Segmentation Fault)

这段代码在许多老旧环境(如某些配置的Turbo C)中可能看似“正常工作”,但在现代标准编译器(如GCC、Clang或MSVC)中,这会引发严重的运行时崩溃或编译警告。

原因解析

1. 存储区域:字符串字面量(String Literal)在程序编译后通常被放置在只读内存区(如.rodata段)。
2. 类型本质:根据C++标准(C语言早期版本略有不同但趋势一致),字符串字面量的类型应为const char[]。直接将其赋值给非const的char *虽然因历史兼容性被部分编译器宽容处理,但属于“未定义行为”(Undefined Behavior)。
3. 推荐写法:
若需修改字符串内容,应使用字符数组分配在栈或堆上的可写内存:

char s[] = "abcde"; // 拷贝字面量到栈内存
s[0] = '1';         // 正确:修改栈上的副本

若只需读取且不希望意外修改,应显式使用const声明以消除歧义:

const char *s = "abcde"; // 最佳实践:明确表达只读意图

总结

处理指针时,务必分清const的位置:左边的const保护数据,右边的const保护地址。同时,坚决避免将字符串字面量赋值给非const指针并进行写入操作,始终遵循“只读用const,可写用数组”的原则,以确保代码的稳定性和跨平台兼容性。

以上就是C语言常量指针与字符串常量操作的详细内容,更多关于C语言指针技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。