C语言结构体中char数组与指针的正确赋值方式

Noah
Noah
发布时间:2026-10-16 | 2人浏览过
原创

在C语言开发中,处理字符串或字符序列时经常遇到两种结构体字段定义:固定大小的 char element[SIZE] 数组和指向堆区内存的 char *element 指针。很多初学者容易混淆两者的内存模型,导致赋值错误或越界崩溃。本文将通过具体代码演示这两种方式的初始化、赋值及打印流程,帮助开发者快速掌握。

核心概念对比

在处理顺序表等结构体时,我们需要区分内存归属:
1. 栈上定长数组:
当定义为 char element[20]; 时,这20个字节的空间是随结构体实例一起分配在栈区的(或包含在结构体内)。这种方式简单,但灵活性低,且存在固定长度限制。

2. 堆上动态指针:
当定义为 char *elment; 时,结构体本身只占4或8个字节的指针空间。真正的字符数据存储需要通过 malloc 申请在堆区。这种方式灵活,但必须手动管理内存释放。

第一种情况:结构体内置 char 数组

第1步:结构体初始化

使用静态定义的数组时,结构体内的数组不需要单独 malloc,直接使用该结构体即可。以下演示了一个简单的结构体定义:

#define MAXSIZE 10
typedef struct SequenceList {
	char element[MAXSIZE];
	int length;
} SequenceList;

初始化时可以创建一个局部实例并设置长度:

SequenceList L;
L.length = MAXSIZE;

第2步:结构体内数据赋值

可以直接通过下标访问数组元素进行赋值。建议使用字符常量而非整数,避免 ASCII 码转换带来的困惑:

for (int i = 0; i < MAXSIZE; i++) {
    L.element[i] = 'a' + i;
}

第3步:打印输出数据

遍历数组进行打印,注意结束条件应严格小于最大长度以防止越界读取:

for (int i = 0; i < MAXSIZE; i++) {
    printf("element[%d] = %c\n", i, L.element[i]);
}

第二种情况:结构体使用 char 数组指针

第1步:内存分配与初始化

指针类型的结构体在使用前必须为其指向的内存区域分配空间。这里极易犯错的地方是指针未初始化直接赋值导致的段错误(Segmentation Fault)。

// 声明一个局部结构体变量
SequenceList L;
L.length = MAXSIZE;
// 关键:为指针分配具体的内存块
L.element = (char*)malloc(L.length * sizeof(char));

第2步:结构体内数据赋值

可以通过下标方式或指针偏移方式进行赋值,两者等价:

for (int i = 0; i < MAXSIZE; i++) {
    // 方法一:数组下标写法
    L.element[i] = 'A' + i;
    
    // 方法二:指针偏移写法 (需确保指针已正确分配)
    *(L.element + i) = 'A' + i;
}

第3步:打印输出数据

同样遍历打印即可:

for (int i = 0; i < MAXSIZE; i++) {
    printf("element[%d] = %c\n", i, L.element[i]);
}

完整可运行代码参考

char 数组版本:

#include <stdio.h>
#define MAXSIZE 10

typedef struct SequenceList {
	char element[MAXSIZE];
	int length;
} SequenceList;

int main()
{
	SequenceList L;
	L.length = MAXSIZE;
 
	for (int i = 0; i < MAXSIZE; i++) {
		L.element[i] = 'a' + i;
	}
 
	for (int i = 0; i < MAXSIZE; i++) {
		printf("element[%d] = %c\n", i, L.element[i]);
	}
	return 0;
}

char 指针版本:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10

typedef struct SequenceList {
	char *element;
	int length;
} SequenceList;

int main()
{
	SequenceList L;
	L.length = MAXSIZE;
	
	// 检查内存分配是否成功
	if ((L.element = (char*)malloc(L.length)) == NULL) {
        return -1;
    }
 
	for (int i = 0; i < MAXSIZE; i++) {
		L.element[i] = 'a' + i;
	}
 
	for (int i = 0; i < MAXSIZE; i++) {
		printf("element[%d] = %c\n", i, L.element[i]);
	}
	
	free(L.element);
	return 0;
}

排错与注意事项

  • 内存泄漏:使用指针版本时,务必在程序结束或结构体销毁前调用 free() 释放 L.element。
  • 越界写入:C语言不会自动检查数组越界。如果循环次数超过 MAXSIZE,会破坏栈/堆上的其他内存数据,导致难以调试的 Crash。
  • 未初始化指针:如果在未执行 malloc 的情况下尝试写 L.element[i],程序会因访问非法地址而崩溃。

以上就是关于C语言结构体中char数组与指针赋值的详细内容,更多关于C语言基础内存管理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表