C语言字符串数组详解:存储机制、初始化与安全操作

雨后青山
雨后青山
发布时间:2026-10-13| 7人浏览过
原创

本文深入解析C语言字符串数组的存储原理,涵盖以\0结尾的字符序列定义、数组长度与字符串长度的关系,以及使用字符串字面量初始化的规则。重点讲解标准库函数如strcat和puts的使用,并通过代码示例展示如何避免缓冲区溢出,介绍C11引入的安全版本函数及宽字符串处理机制。

C语言字符串数组

字符串本质上是一串连续的字符序列,其末尾必须包含一个空字符'\0'作为终止标志。字符串的长度是指其中所有字符的数量,计算时不包含末尾的空字符'\0'。需要注意的是,C语言标准中并未定义专门的字符串数据类型,因此也不存在直接以字符串为操作数的运算符。

在C语言中,字符串通常存储在元素类型为char的数组中,或者使用宽字符类型(如wchar_t、char16_t或char32_t)的数组。由宽字符构成的字符串被称为宽字符串(wide string)。

C标准库提供了丰富的函数库,用于执行字符串的基本操作,包括比较、复制和连接等。除了这些传统函数外,C11标准还引入了这些函数的“安全”版本,旨在防止字符串操作时超出数组边界,从而提升程序的安全性。

可以使用字符串字面量来初始化任意类型的字符数组。例如,以下两种数组定义方式在功能上是等价的:

char str1[30] = "Let's go";             // 字符串长度:8;数组长度:30
char str1[30] = { 'L', 'e', 't', '\'', 's',' ', 'g', 'o', '\0' };

存储字符串的数组必须比字符串本身的长度多出一个元素,以便容纳末尾的空字符'\0'。因此,上述代码中str1数组能存储的最大字符串长度为29(总长度30减去1个终止符)。如果将数组长度定义为8而非30,则会引发错误,因为该空间不足以包含完整的字符串及其终止符。

如果在定义字符数组时未显式指定长度,但使用字符串字面量进行初始化,编译器会自动将数组长度设置为字符串长度加1。具体示例如下:

char str2[] = " to London!";    // 字符串长度:11 (注意开头的空格);
                                                // 数组长度:12

下面的语句演示了如何使用标准函数strcat()将字符串str2附加到字符串str1的末尾。需要注意的是,str1数组的长度必须足够大,以容纳连接后的所有字符及终止符。

#include <string.h>
char str1[30] = "Let's go";
char str2[ ] = " to London!";
/* ... */
strcat( str1, str2 );
puts( str1 );

调用puts()函数后,输出更新后的str1数组内容如下:

Let's go to London!

在C语言中,字符串变量名str1和str2实际上是指针,它们分别指向各自数组的第一个字符。这种指针被称为指向字符串的指针,或简称为字符串指针。

字符串处理函数(如strcat()和puts())需要接收字符串的起始地址作为参数。这类函数通常逐个字符地处理字符串,直到遇到结尾终止符'\0'为止。 例1展示了函数strcat()的一种可能实现方式,它通过从函数参数传入的指针来遍历并处理整个字符串。【例1】函数strcat()

// 函数strcat() 将第二个字符串复制一份并附加到第一个字符串的尾部
// 参数:指向两个字符串的指针
// 返回值:指向第一个字符串的指针,此时已将第二个字符串连接到了其尾部
char *strcat( char * restrict s1, const char * restrict s2 )
{
  char *rtnPtr = s1;
  while ( *s1 != '\0' )                         // 找到字符串s1的尾部
    ++s1;
  while (( *s1++ = *s2++ ) != '\0' )    // 将s2的首字符替换掉s1的终止符
    ;
  return rtnPtr;
}

以s1地址为起点的char数组,其长度至少应为两个字符串长度之和再加1,以容纳最终的字符串终止符。在调用strcat()之前,可以使用标准函数strlen()来检查长度是否足够,该函数返回字符串参数的长度,用法如下:

if ( sizeof(str1) >= ( strlen( str1 ) + strlen( str2 ) + 1 ) )
  strcat( str1, str2 );

宽字符串字面量前会加上前缀L、u或U,用以标识其为宽字符串。因此,wchar_t数组的初始化过程如下所示:

#include <stddef.h>                        // 定义wchart_t类型
/* ... */
wchar_t dinner[] = L"chop suey";        // 字符串长度:10;
                                                // 数组长度:11;
                                                // 数组空间大小:11 * sizeof(wchar_t)

本文关于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 算法库。