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
相关产品推荐
相关产品推荐

