【问题标题】:Allocate struct on the heap in C [duplicate]在C中的堆上分配结构[重复]
【发布时间】:2014-06-19 21:25:05
【问题描述】:
#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 和一般互联网上试图找到与我的问题相关的示例或帖子,但我没有找到任何东西。

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


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

【问题讨论】:

  • 你是按值传递地址,你需要传递地址的地址。阅读Need of Pointer to pointer
  • 不是重复的。好吧,反正不是那个问题。
  • SO 上有数百个(可能是数千个)“为什么我对这个变量(按值传递)的更改不保留在调用函数中”线程。

标签: c struct segmentation-fault heap-memory


【解决方案1】:

在这个函数中,

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;
}

【讨论】:

    【解决方案2】:

    实际上,指针只是一个整数,当您将 struct1 传递给您的函数时,因为 struct1 为空,您实际上只是将 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;
    }
    

    【讨论】:

      【解决方案3】:

      因为要更改方法中的struct1 指针,所以需要将指针返回给调用者,或者将其作为双指针(调用者指针的地址)传递,例如

      返回:

      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 的cmets 进行分配和使用。

      【讨论】:

      • 另外称它为allocateMem(&amp;struct1);
      • StuartLC 你还应该建议struct1 = malloc(sizeof(struct myStruct)); 也应该是(*struct1) = malloc(sizeof(struct myStruct)); 声明更改代码。
      • struct* allocateMem(){ 应该是struct myStruct* allocateMem(){
      猜你喜欢
      • 1970-01-01
      • 2014-08-12
      • 2011-12-01
      • 2012-04-01
      • 2013-03-30
      • 2018-06-08
      • 2016-03-24
      • 2011-03-06
      • 2020-01-05
      相关资源
      最近更新 更多