gpt4 book ai didi

c - 使用 free() 函数会导致运行时错误

转载 作者:行者123 更新时间:2023-12-01 23:27:34 25 4
gpt4 key购买 nike

我有一个名为 Person 的结构,它包含两个属性 - 名字和姓氏。
在为 Person 类型的变量成功动态分配内存后,为我想释放内存的属性赋值,但我不断收到运行时错误(程序窗口刚刚崩溃)
这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char firstName[15];
char lastName[15];
} Person;

void main(){
int len = 0;
char firstName[]="danny", lastName[]="johnes";

Person *temp = (Person*)malloc(sizeof(Person));
if (temp == NULL)
return;

len = strlen(firstName);
temp->firstName[len] = (char*)malloc(sizeof(char)*(len));
if (temp->firstName == NULL)
return;
strcpy(temp->firstName, firstName);

len = strlen(lastName);
temp->lastName[len] = (char*)malloc(sizeof(char)*(len));
if (temp->firstName == NULL)
return;
strcpy(temp->lastName, lastName);

freePerson(temp);
system("pause");
return;
}

这是我用来释放内存的函数:
void freePerson(Person* ps) {
if (ps != NULL) {
free(ps->firstName);
free(ps->lastName);
free(ps);
}
}

我想让代码做的就是将名称存储在动态分配的结构中,然后释放它。
稍后,我计划用从文件输入的值替换硬编码的名称。

关于错误的任何想法?谢谢你。

最佳答案

您已经为 firstName 分配了空间,因此您必须在大小限制(15 字节)内复制名称。您可以像这样使用 snprintf 做到这一点:

snprintf(temp->firstName, sizeof(temp->firstName), "%s", firstName);
lastName 也是如此.请注意,如果长度超过字段的大小,则两者都可能会被截断。

另一种选择是动态分配字段。那么你的结构成员应该是指针,而不是字符数组:
typedef struct {
char *firstName;
char *lastName;
} Person;

然后,您可以像这样分配和分配名称:
temp->firstName = strdup(firstName); // (same for lastName)

但请注意,如果您想释放整个项目,则必须单独释放这些字段。

关于c - 使用 free() 函数会导致运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54047266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com