You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会变成野指针,访问也会异常。
修复方案
  1. 首先修正内存分配逻辑,分配struct _Text大小的内存,两种写法选一种即可:
// 写法1:直接计算结构体大小
Text txt = malloc(sizeof(struct _Text));
// 写法2:用指针指向的内容推导大小,更不容易出错
Text txt = malloc(sizeof(*txt));
  1. 如果需要独立存储字符串内容,不要直接赋值指针,应该申请内存拷贝字符串内容,比如用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);
  1. 补充空指针校验和资源释放逻辑,避免崩溃和内存泄漏。

完整可运行的正确代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:54:00