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

C语言People结构体创建函数崩溃问题求助及代码修正

嘿,我来帮你排查下代码崩溃的原因,以及怎么修复它:

你的代码崩溃的核心问题
  • 函数没有返回值,且误用栈局部变量:你在createPeople里定义的people1是栈上的局部变量,函数执行结束后,栈上的这个变量会被系统回收。更关键的是,你的函数声明明确要返回People*类型,但函数里完全没有return语句,这会触发未定义行为,程序直接崩溃是必然的结果。就算你硬加return &people1;,返回的也是已经被销毁的栈变量地址,后续访问这个指针一样会崩溃。
  • 没有创建字符串参数的副本:你现在只是把传入的firstname和lastname指针直接赋值给结构体字段,这并没有复制字符串的内容。如果调用这个函数时传入的是临时字符串(比如栈上的局部字符串)或者后续被修改/释放的内存,结构体里的指针就会变成野指针,访问时同样会导致崩溃。
修正后的完整代码

People.h(保持原定义即可)

#ifndef _PEOPLE_H_
#define _PEOPLE_H_

typedef struct {
    char* firstname;
    char* lastname;
    int age;
} People;

People* createPeople(char* firstname, char* lastname, int age);

#endif

Array.c(修复后的实现)

#include "People.h"
#include <stdlib.h>
#include <string.h> // 用于字符串复制相关函数

People* createPeople(char* firstname, char* lastname, int age) {
    // 1. 在堆上分配People结构体的内存,堆内存不会随函数结束被回收
    People* new_people = malloc(sizeof(People));
    if (new_people == NULL) { // 务必检查内存分配是否成功
        return NULL;
    }

    // 2. 复制名字和姓氏的内容,创建参数的独立副本
    // 使用strdup:自动分配内存并复制字符串,属于POSIX标准,大部分平台都支持
    new_people->firstname = strdup(firstname);
    new_people->lastname = strdup(lastname);

    // 如果需要兼容纯C标准(不依赖strdup),可以手动实现内存分配+复制:
    // new_people->firstname = malloc(strlen(firstname) + 1);
    // if (new_people->firstname != NULL) {
    //     strcpy(new_people->firstname, firstname);
    // }
    // // 同理处理lastname
    // new_people->lastname = malloc(strlen(lastname) + 1);
    // if (new_people->lastname != NULL) {
    //     strcpy(new_people->lastname, lastname);
    // }

    // 3. 初始化年龄字段
    new_people->age = age;

    // 4. 返回堆上的结构体指针
    return new_people;
}
额外重要提示
  • 记得手动释放内存:因为我们用malloc和strdup分配了堆内存,当你不再需要这个People结构体时,一定要按顺序释放内存,避免内存泄漏:
    void freePeople(People* p) {
        if (p != NULL) {
            free(p->firstname); // 先释放字符串内存
            free(p->lastname);
            free(p); // 最后释放结构体本身
        }
    }
    
  • 处理内存分配失败的情况:malloc和strdup都有可能因为内存不足返回NULL,实际项目里最好加上对应的错误处理逻辑,避免后续访问NULL指针引发新的崩溃。

内容的提问来源于stack exchange,提问作者user20986291

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:21:00