在C中为堆分配struct

时间:2014-05-03 06:05:11

标签: c struct segmentation-fault heap

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

struct myStruct
{
    int number;
};

void
allocateMem(struct myStruct *struct1)
{
    struct1 = malloc(sizeof(struct myStruct));
    struct1->number = 500;
    printf("struct1->number: %d\n", struct1->number);
}

int
main(int argc, char *argv[])
{
    struct myStruct *struct1 = NULL;
    allocateMem(struct1);
    printf("number: %d\n", struct1->number);
    return 0;
}

StackOverflow的公民们,我寻求您的帮助。

我要做的是使用堆空间而不是堆栈空间分配结构;我正在尝试在函数内部进行分配。无论我多么混乱,我总是得到分段错误或几个编译器警告。

我在这里做错了什么,但我无法弄清楚什么,我已经遍布StackOverflow和一般互联网试图找到与我的问题相关的示例或帖子但是我还没找到任何东西。

如果你能告诉我我做错了什么,或者只是指出我正确的方向,我将非常感激。


感谢大家的快速准确回复。你是对的,我需要一个指针指针,我的代码现在可以帮助你。

3 个答案:

答案 0 :(得分:5)

在此功能中,

void
allocateMem(struct myStruct *struct1)
{
    struct1 = malloc(sizeof(struct myStruct));
    struct1->number = 500;
    printf("struct1->number: %d\n", struct1->number);
}

struct1按值传递。您在函数中对它所做的任何更改都不会从调用函数中看到。

更好的选择:

struct myStruct* allocateMem()
{
    struct myStruct *struct1 = malloc(sizeof(struct myStruct));
    struct1->number = 500;
    printf("struct1->number: %d\n", struct1->number);
    return struct1;
}

将呼叫功能更改为:

int
main(int argc, char *argv[])
{
    struct myStruct *struct1 = allocateMem();
    printf("number: %d\n", struct1->number);

    // Make sure to free the memory.
    free(struct1);

    return 0;
}

答案 1 :(得分:3)

指针实际上只是一个整数,当你将struct1传入函数时,因为struct1为null,你实际上只是将0传递给你的函数。该值在堆栈上传递,您执行堆分配并使用新地址更新堆栈值。但是当你从函数返回时,该值只会弹出堆栈而你泄漏了那个内存。 main中struct1的值(它也在堆栈上仍然保持其值0(NULL)。所以如果你想要更新那个值,你必须传入一个指向指针的指针,或者更简单的方法就是返回来自你的函数的malloc指针。

这是您可以修改功能的一种方法:

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

struct myStruct
{
    int number;
};

struct myStruct*
allocateMem()
{
    struct myStruct* struct1 = malloc(sizeof(struct myStruct));
    struct1->number = 500;
    printf("struct1->number: %d\n", struct1->number);
    return struct1;
}

int
main(int argc, char *argv[])
{
    struct myStruct *struct1 = allocateMem();
    printf("number: %d\n", struct1->number);
    return 0;
}

答案 2 :(得分:2)

因为您正在更改方法中的struct1指针,您需要将指针返回给调用者,或者将其作为双指针(调用者指针的地址)传递,例如< / p>

返回:

struct myStruct* allocateMem()
{
    struct myStruct* struct1 = malloc(sizeof(struct myStruct));
    struct1->number = 500;
    printf("struct1->number: %d\n", struct1->number);
    return struct1;
}

双指针:

void allocateMem(struct myStruct **struct1) 
{

根据@ Grijesh的评论进行分配和使用。