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
是一样的。我会弄明白的