繁体   English   中英

通过 C 中的指针数组访问结构的成员

[英]Accessing members of a struct via an array of pointers in C

main 中的第二个 if 语句不会打印出来。 如果我只放置它们执行的 if 语句之一,但由于某种原因将它们放在一起会导致第二个 if 语句不打印任何内容。 谁能解释为什么会这样?

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

typedef struct entry {
    int value;        
    char *key;
    int type;
} entry;

entry* array[5];

void init_arr(){
    for(int i=0; i<5; i++){
        array[i] = NULL;
    }

    entry new;
    new.value = 2;
    new.key = NULL;
    new.type = 5;
    array[3]= &new;
        
}

int main(){
    init_arr();

    if(array[3]->value == 2){
        printf("ok\n");
    }

    if(array[3]->key == NULL){
        printf("ok 2\n");
    }
    return 0;
}```

new是一个自动变量。 它仅在init_arr()执行时存在。 一旦你离开 function,之前用于new的 memory 可能会用于其他一些事情,因此array[3]->keyarray[3]->value实际上都没有定义。

如果你得到array[3]->value的“正确”值只是因为如果第一个if被评估,那么用于new的 memory 仍然有可能还没有被回收,但它肯定已经被评估第二个if的时间。

如果您需要new使用的 memory 即使在 function 退出后仍然有效,请将其声明为static

void init_arr()
{
    static entry new;

    for(int i=0; i<5; i++)
        array[i] = NULL;

    new.value = 2;
    new.key = NULL;
    new.type = 5;
    array[3]= &new;
}

或者为它分配 memory :

void init_arr()
{
    for(int i=0; i<5; i++)
        array[i] = NULL;

    array[3] = malloc(sizeof *array);     
    array[3].value = 2;
    array[3].key = NULL;
    array[3].type = 5;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM