C 如何为结构成员正确分配内存?

C 如何为结构成员正确分配内存?,c,memory-management,struct,malloc,calloc,C,Memory Management,Struct,Malloc,Calloc,这个问题不言自明。我想实现一个函数,创建一个初始容量为..的动态数组结构初始容量和内部的一些属性。 代码如下: #include <malloc.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> typedef struct IntVector { int *vector; unsigned int capacity; uns

这个问题不言自明。我想实现一个函数,创建一个初始容量为..的动态数组结构<代码>初始容量和内部的一些属性。
代码如下:

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

typedef struct IntVector {
        int *vector;
        unsigned int capacity;
        unsigned int size;
} IntVector;

IntVector *int_vector_new(size_t initial_capacity) {
        struct IntVector v = {calloc(initial_capacity, sizeof(int)),
                               initial_capacity, 0};
        IntVector* v_ptr = &v;
        return v_ptr;
}
正如您所看到的,我已经连续三个小时试图修复此问题,但没有任何进展。
希望得到您的帮助。

函数

IntVector *int_vector_new(size_t initial_capacity) {
        struct IntVector v = {calloc(initial_capacity, sizeof(int)),
                               initial_capacity, 0};
        IntVector* v_ptr = &v;
        return v_ptr;
}
返回指向声明为like的局部变量的指针

struct IntVector v
因此,退出函数后,指针的值无效,因为指向的对象不再处于活动状态

动态分配结构类型的对象并返回指向 分配的内存。或者通过值将对象v本身返回给函数的调用方

比如说

IntVector int_vector_new(size_t initial_capacity) {
        struct IntVector v = {calloc(initial_capacity, sizeof(int)),
                               initial_capacity, 0};
        return v;
}

您可以添加一个检查,检查内存是否已成功分配。

该函数

IntVector *int_vector_new(size_t initial_capacity) {
        struct IntVector v = {calloc(initial_capacity, sizeof(int)),
                               initial_capacity, 0};
        IntVector* v_ptr = &v;
        return v_ptr;
}
返回指向声明为like的局部变量的指针

struct IntVector v
因此,退出函数后,指针的值无效,因为指向的对象不再处于活动状态

动态分配结构类型的对象并返回指向 分配的内存。或者通过值将对象v本身返回给函数的调用方

比如说

IntVector int_vector_new(size_t initial_capacity) {
        struct IntVector v = {calloc(initial_capacity, sizeof(int)),
                               initial_capacity, 0};
        return v;
}


您可以添加一个检查,检查内存是否已成功分配。

我不知道可能发生的一切,因为目前您没有任何代码显示调用此函数的位置,但我发现了一个大问题。您将返回一个指向在
int\u vector\u new
中创建的值的指针,因此一旦该函数返回指向(
v
)的局部变量,该变量将消失

您可以为v分配内存,如下所示:
IntVector*v=malloc(sizeof(IntVector))

然后使用
->
语法设置每个字段。像这样:

IntVector* v = malloc(sizeof(IntVector));
v->vector = calloc(initial_capacity, sizeof(int));
v->capacity = initial_capacity;
v->size = 0;

return v;

由于valgrind抱怨泄漏,我猜您并没有在以后的代码中释放
vector
。释放将修复有关内存泄漏的投诉。一旦您使用
malloc
分配
v
,您将需要释放
int\u vector\u new
返回的任何值。

我不知道可能发生的一切,因为目前您没有任何代码显示调用此函数的位置,但我看到了一个大问题。您将返回一个指向在
int\u vector\u new
中创建的值的指针,因此一旦该函数返回指向(
v
)的局部变量,该变量将消失

您可以为v分配内存,如下所示:
IntVector*v=malloc(sizeof(IntVector))

然后使用
->
语法设置每个字段。像这样:

IntVector* v = malloc(sizeof(IntVector));
v->vector = calloc(initial_capacity, sizeof(int));
v->capacity = initial_capacity;
v->size = 0;

return v;


由于valgrind抱怨泄漏,我猜您并没有在以后的代码中释放
vector
。释放将修复有关内存泄漏的投诉。一旦您使用
malloc
分配
v
,您将需要释放
int\u vector\u new
返回的任何值。

您是如何编译程序的?您是否有一个单独的文件,其中有一个主函数?您不能返回指向局部变量的指针,当函数返回时,该变量将被销毁。您需要使用
malloc()
分配结构。您认为
struct IntVector v
int\u vector\u new()之后会发生什么情况
返回?详细信息:C将
.vector、.capacity、
定义为成员,而不是字段。您是如何编译程序的?您是否有一个单独的文件,其中有一个主函数?您不能返回指向局部变量的指针,当函数返回时,该变量将被销毁。您需要使用
malloc()
分配结构。您认为
struct IntVector v
int\u vector\u new()之后会发生什么情况
返回?详细信息:C将
.vector、.capacity、
定义为成员,而不是字段。或者让调用方创建结构并传递指向它的指针,并让此函数适当地填充该结构的成员。“struct Inventor”代表什么?GCC抛出了相当合理的错误。我认为这是一个输入错误,并将其更正为“struct IntVector”,但这也会导致内存泄漏,尽管这与我的代码有点不同。如果你不会忘记释放数据成员,就不会有内存泄漏。是的,Addison向我解释过。感谢您,或者让调用者创建结构并传递指向它的指针,并让此函数适当地填充该结构的成员。“struct Inventor”代表什么?GCC抛出了相当合理的错误。我认为这是一个输入错误,并将其更正为“struct IntVector”,但这也会导致内存泄漏,尽管这与我的代码有点不同。如果你不会忘记释放数据成员,就不会有内存泄漏。是的,Addison向我解释过。感谢您对以下语句的关注:
#include
#include
1)堆分配函数,包括
malloc()
在头
stdlib.h
中是原型,因此头
malloc.h
是不需要的(应该删除)2)头文件中没有任何内容:
stddef.h
正在使用。包含未使用的头文件是一种非常糟糕的编程实践。建议删除该语句。编译时,请始终启用警告,然后修复这些警告。(对于
gcc
,至少使用:
-Wall-Wextra-Wconversion-pedantic-std=gnu11
)注意:其他编译器使用不同的选项生成相同的结果如何释放结构字段?@altbrace如果您有一个名为
v
IntVector*
,您可以执行
释放(v->容量)
。如果你有一个
IntVector
,它将是
免费的(v.capacity)
。基本上,
->
用于在有指向结构的指针时访问结构字段
a->b
(*a).b
是一样的。我会弄明白的