传入struct指针后无法获取struct

时间:2014-02-13 07:22:23

标签: c pointers struct

我在函数query中遇到错误。它没有返回结果。 函数generate初始化结果。它由函数query调用。

//定义结构

#define MAX 50

typedef struct {
    char I[50];
    char name[10];
} object;


typedef struct {
    int num_items;
    object items[MAX];
} arg_t;

// function generate

void generate (object *q) {
    // initialize
    object objectArray[] = {
        {
        .I = "1",
        .name = "John"
        }, // item 1
        {
        .I = "2",
        .name = "Jane"
        }, // item 2
    };

    q = malloc(sizeof(arg_t));

    q->num_items = 2;
    printf("There are %d of elements in the record.\n", q->num_items);
    memcpy(q->items, object, sizeof(object) * q->num_items);

    int i =0;

    for (i=0; i < q->num_items ;i++) {
        printf("option: %s \n", q->items[i].I);
        printf("option: %s \n", q->items[i].name);
    }
    printf("Leaving Generate()\n");
}

//函数查询

void query () {
    arg_t qHolder;
    arg_t *q = &qHolder;    // give the pointer an address
    q = malloc(sizeof(arg_t));

    generate (q);
    printf("There are %d of elements in the record.\n", qHolder.num_items); // <b> This line is wrong. It is giving 0 instead of 2. </b>
// There is no compiler error. It just does not print when it runs after the follwing line
    int i =0;

    for (i=0; i < q->num_items;i++) {
        printf("option: %s \n", qHolder.items[i].I);
        printf("option: %s \n", qHolder.items[i].name);
    }
    printf("Leaving Query()\n");
}

在main()

    query ();

2 个答案:

答案 0 :(得分:1)

您在generate功能中犯了初学者错误。您必须记住,在C中,所有参数都是按值传递的,这意味着它们的值被复制到函数内的局部变量中。这意味着当您在q函数内分配generate时,您只需指定本地副本。调用generate函数时传递的参数不会被修改。

此外,您需要检查您的设计,因为在query中您首先q指向&qHolder,然后您覆盖指针与您的通话至malloc,您在malloc内再次致电generate。所以你设置指针三次,只有其中一个就足够了。

我想知道如果没有编译器对你大喊大叫,这会编译,因为q 不是 object结构。

答案 1 :(得分:1)

您的generate()函数采用object *q参数,但它首先要做的是通过将malloc()的结果赋给它来覆盖指针的值。不要那样做,因为调用者告诉你在哪里存储object,所以不需要分配新的内存。

这是一个固定版本:

void generate (object *q) {
    // initialize
    const object objectArray[] = {
        {
        .I = "1",
        .name = "John"
        }, // item 1
        {
        .I = "2",
        .name = "Jane"
        }, // item 2
    };

    q->num_items = sizeof objectArray / sizeof *objectArray;
    printf("There are %d of elements in the record.\n", q->num_items);
    memcpy(q->items, objectArray, sizeof objectArray);

    for (int i = 0; i < q->num_items; ++i) {
        printf("option: %s\n", q->items[i].I);
        printf("option: %s\n", q->items[i].name);
    }
    printf("Leaving generate()\n");
}

然后在query()中,您再次通过调用malloc()来覆盖指针。我想你需要了解基础知识。

这是一个固定版本:

void query (void) {
    arg_t qHolder;

    generate (&qHolder);
    printf("There are %d of elements in the record.\n", qHolder.num_items);
    for (int i = 0; i < q->num_items; ++i) {
        printf("option: %s \n", Holder.items[i].I);
        printf("option: %s \n", qHolder.items[i].name);
    }
    printf("Leaving query()\n");
}