C语言Struct pointer未按预期保存字符数组问题求助
问题原因
- 内存分配大小错误:你定义的
Text是struct _Text*的别名,所以sizeof(Text)计算的是指针类型的大小(通常32位系统是4字节,64位是8字节),远小于struct _Text结构体本身需要的内存空间。malloc分配的内存不足,后续访问txt->str等成员属于越界访问,触发未定义行为,自然无法正确存储数据。 - 指针直接赋值的潜在问题:你当前直接把字符串字面量的地址赋值给
txt->str,首先字符串字面量存储在只读内存段,后续如果尝试修改txt->str指向的内容会直接触发段错误;其次如果后续你用栈上的局部字符数组赋值给txt->str,局部数组回收后txt->str会变成野指针,访问也会异常。
修复方案
- 首先修正内存分配逻辑,分配
struct _Text大小的内存,两种写法选一种即可:
// 写法1:直接计算结构体大小 Text txt = malloc(sizeof(struct _Text)); // 写法2:用指针指向的内容推导大小,更不容易出错 Text txt = malloc(sizeof(*txt));
- 如果需要独立存储字符串内容,不要直接赋值指针,应该申请内存拷贝字符串内容,比如用
strdup或者手动malloc+strcpy:
char *txtStr = "hi"; // 方式1:用strdup直接拷贝(POSIX标准函数,大部分编译器支持) txt->str = strdup(txtStr); // 方式2:手动实现拷贝,兼容性更好 txt->str = malloc(strlen(txtStr) + 1); // +1是存字符串结束符'\0' strcpy(txt->str, txtStr);
- 补充空指针校验和资源释放逻辑,避免崩溃和内存泄漏。
完整可运行的正确代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _Text { char *str; int length; int counter; } *Text; int main(void) { // 分配正确大小的结构体内存 Text txt = malloc(sizeof(*txt)); if (txt == NULL) { perror("malloc failed"); return 1; } char *txtStr = "hi"; // 拷贝字符串内容而非直接赋值指针 txt->length = strlen(txtStr); txt->str = malloc(txt->length + 1); if (txt->str == NULL) { perror("malloc str failed"); free(txt); return 1; } strcpy(txt->str, txtStr); txt->counter = 1; // 测试输出,可正确打印 str: hi, length: 2, counter: 1 printf("str: %s, length: %d, counter: %d\n", txt->str, txt->length, txt->counter); // 释放资源 free(txt->str); free(txt); return 0; }
内容的提问来源于stack exchange,提问作者Corbel Jhonshon
相关产品推荐
相关产品推荐

