通过函数初始化C结构

4 c struct pointers

所以我必须vector在C中编写一个类似的数据结构.通常我做了这样的结构:

struct Vector
{
    int length;
    int *elements;
};
Run Code Online (Sandbox Code Playgroud)

和这些功能:

void initialize_vector(struct Vector* vector);
void create_vector(struct Vector* vector, int* array, int n);
void remove_vector(struct Vector* vector);
void vector_add_element(struct Vector* vector, int element);
void vector_insert(struct Vector* vector, int index, int element);
void vector_remove_element(struct Vector* vector, int element);
void vector_remove_at(struct Vector* vector, int index);
Run Code Online (Sandbox Code Playgroud)

现在,initialize_vector()函数,我只想将矢量属性初始化为默认值(如length0和*elementsNULL).我写了这样的东西:

void initialize_vector(struct Vector* vector)
{
    vector->elements = NULL;
    vector->length = 0;
}
Run Code Online (Sandbox Code Playgroud)

我试着检查它是否有效,所以我写了这段代码:

#include <stdio.h>
#include "vector.h"


int main(int arc, char** argv)
{
    struct Vector* vec;
    initialize_vector(vec);
    printf("%d\n", vec->length);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我出名了Segmentation fault,所以我检查了GDB,当然,当一切搞砸了这一行:vector->elements = NULL;.

我不知道问题出在哪里.我宣布一个向量,我猜它正确传递它并且它混乱了.我知道这可能是微不足道的,我会被一些超级计划的家伙大肆投票,但是,嘿,他没有任何疑问,没有任何学问.

dbu*_*ush 9

你没有声明一个向量,你声明了一个指向向量的指针.该指针未初始化,因此尝试取消引用它会调用未定义的行为.

创建struct Vector并传递其地址:

struct Vector vec;
initialize_vector(&vec);
printf("%d\n", vec.length);
Run Code Online (Sandbox Code Playgroud)

如果要同时为a分配空间struct Vector,请更改要调用的函数malloc并返回指针:

struct Vector *initialize_vector()
{
    struct Vector *vector = malloc(sizeof(*vector));
    if (!vector) {
        perror("malloc failed");
        exit(1);
    }
    vector->elements = NULL;
    vector->length = 0;
    return vector;
}

...

struct Vector *vector = initialize_vector();
Run Code Online (Sandbox Code Playgroud)

  • @Coldspeed您正在修改局部变量。该修改在函数外部不可见。 (2认同)