gpt4 book ai didi

c - Malloc() 和 free() 阻止我在 C 中按值传递结构

转载 作者:行者123 更新时间:2023-11-30 20:55:01 24 4
gpt4 key购买 nike

我正在开发一个项目,并且不断出现段错误,并且结构的值没有被传递。弄清楚为什么让我发疯。我尝试用更简单的程序来解决问题,我想我已经找到了问题,但我不确定如何解决它。

问题是,当我“malloc”一个结构,然后按值传递时,该值会丢失。稍后添加“free”会产生段错误。我没有尝试访问“malloc()”之前或“free()”之后的值,所以我很困惑为什么会发生这种情况。

这是问题的简单模型:

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

struct structexample
{
int element;
};

void initStruct(struct structexample * teststruct, int * number)
{
teststruct = malloc(sizeof(struct structexample));
teststruct->element = 10;
printf("teststruct element is %d in initStruct\n", teststruct->element);
*number = 5;
}

void printtest(struct structexample * teststruct, int * number)
{
printf("teststruct element is %d in printtest\n", teststruct->element);
printf("Number is %d\n", *number);
free(teststruct);
}

int main()
{
int number;
struct structexample teststruct;
initStruct(&teststruct, &number);
printtest(&teststruct, &number);
printf("teststruct element is %d in main()", teststruct.element);
return 0;
}

这会产生:

teststruct element is 10 in initStruct
teststruct element is -7967792 in printtest
Number is 5
Segmentation fault

我使用“gcc -Wall -pedantic -ansi”编译程序,没有收到任何错误或警告。

当我注释掉“malloc”和“free”时,它会正确生成:

teststruct element is 10 in initStruct
teststruct element is 10 in printtest
Number is 5

如果我只注释掉“free”但保留“malloc”,则可以修复段错误,但结构的值仍然不正确。在这个简单的程序中,我实际上并不需要“malloc()”和“free()”,但在我的较大项目中确实需要它们。如果我能让它们在这个更简单的程序中工作,那么我想我可以修复更大的程序。遗憾的是,我在 Google 上找不到类似的问题。

最佳答案

您正在混合堆栈和堆

void initStruct(struct structexample * teststruct, int * number)
{
teststruct = malloc(sizeof(struct structexample));
^ There is no need to use malloc, teststruct is on the stack

...

int main()
{
int number;
struct structexample teststruct;
initStruct(&teststruct, &number);

关于c - Malloc() 和 free() 阻止我在 C 中按值传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706559/

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