简体   繁体   中英

Access values of structs from a pointer in a struct

I'm going to try and keep this as brief as possible. So I have two structs:

typedef struct someStruct named;
struct someStruct {
    void *key;                  
    void *value;                    
};
typedef struct anotherStruct namedToo;
struct anotherStruct {
    named **table;          
    unsigned int size;          
};

Okay great, now ingore any possible mistakes above, this is uneditable code.

Now I have two methods:

namedToo *init(float ignoreThis) {
    namedToo *temp;
    temp = malloc(sizeof(namedToo)); //some memory for the second struct
    temp->table = malloc(sizeof(named)*100); //lets say this 100 is for 100 buckets/cells/named elements
    return temp;

Method 2:

int insert(namedToo *temp, void* key, void* value) {
     temp->table[0]->key = key; //My problem, I need to access the value and key inside named from the pointer inside namedToo. How can I do this?
}

The comment has my problem : My problem, I need to access the value and key inside named from the pointer inside namedToo. How can I do this? I would need to change and grab value/key on their own from time to time.

The declaration named **table; says table is pointer to a pointer to named , or alternately an array of pointer to named . The latter is you seem to intend.

This allocation:

temp->table = malloc(sizeof(named)*100); 

Allocates space for 100 named , but what you need are 100 named * , and each of those must point to a named . Given the definition of named this is likely enough space, however at this point you have an array of uninitialized pointers. Attempting to access them results in undefined behavior , which in this case manifests as a core dump.

You need to allocate space for an array of pointers, then initialize each of those to a single dynamically allocated instance of named . So you should be allocating space like this:

int i;
temp->table = malloc(sizeof(named *)*100);
for (i=0; i<100; i++) {
    temp->table[i] = malloc(sizeof(named));
}

Then your insert method should work properly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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