深入解析C语言中char*与char[]的本质区别

Cora
Cora
发布时间:2026-10-14| 5人浏览过
原创

C语言初学者常误以为 char* 和 char[] 可以互换使用,但它们在底层内存结构和运行机制上存在显著差异。理解这些差异对于编写安全、高效的代码至关重要。

内存结构与常量区

char *s = "hello"; 定义了一个指向字符串常量的指针。此时,s 存储的是字符串在内存中的地址。该字符串通常存储在静态数据段(只读区域),因此试图通过指针修改其内容会导致运行时错误:

char *s = "hello";
s[0] = 'a'; // 错误:尝试写入只读内存

相比之下,char s[] = "hello"; 创建了一个字符数组。编译器会在栈内存中为该数组分配空间,并将字符串字面量的内容复制到该空间中。由于栈内存是可写的,以下操作完全合法:

char s[] = "hello";
s[0] = 'a'; // 正确:修改数组内容

指针与数组的关联

当数组名被用作右值时,它会退化为指向首元素的指针。例如:

char s[] = "hello";
char *p = s;
p[0] = 'a'; // 等价于 s[0] = 'a',同样有效

此外,通过 malloc 动态分配的堆内存也具有可读写性,其行为类似于数组,只是需要手动管理内存生命周期:

char *s = (char *)malloc(10);
// 注意:需确保 malloc 成功且释放后使用 free(s);

sizeof 运算符的差异

sizeof 在编译期求值,对指针返回的是指针本身的大小,对数组返回的是整个缓冲区的字节数。以下测试程序展示了这种差异:

#include <stdio.h>
int main() {
    char *buf1 = "this is a test";
    char buf2[] = "this is a test";
    printf("buf1 (pointer) size: %zu\n", sizeof(buf1));   // 通常为 4 或 8 字节
    printf("buf2 (array) size: %zu\n", sizeof(buf2));     // 15 字节 (含 '\0')

总结与注意事项

简而言之,指针变量存的是“地址”,而数组变量存的是“数据”。在使用 const 修饰符时,这种界限更加明确:const char *p 保护了数据不被修改,而 char p[] 则允许直接操作栈上的副本。

以上就是深入解析C语言中char*与char[]本质的详细内容,更多关于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 算法库。