2010-04-15 31 views
11

Tôi có một bài tập nhỏ trong C. Tôi đang cố gắng tạo một mảng các con trỏ tới một cấu trúc. Câu hỏi của tôi là làm thế nào tôi có thể khởi tạo mỗi con trỏ để NULL? Ngoài ra, sau khi tôi cấp phát bộ nhớ cho một thành viên của mảng, tôi không thể gán giá trị cho cấu trúc mà phần tử mảng trỏ đến.Làm thế nào tôi có thể khai báo và khởi tạo một mảng con trỏ tới một cấu trúc trong C?

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

typedef struct list_node list_node_t; 

struct list_node 
{ 
    char *key; 
    int value; 
    list_node_t *next; 
}; 


int main() 
{ 

    list_node_t *ptr = (list_node_t*) malloc(sizeof(list_node_t)); 

    ptr->key = "Hello There"; 
    ptr->value = 1; 
    ptr->next = NULL; 

    // Above works fine 

    // Below is erroneous 

    list_node_t **array[10] = {NULL};  

    *array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 
    array[0]->key = "Hello world!"; //request for member ‘key’ in something not a structure or union 
    array[0]->value = 22;   //request for member ‘value’ in something not a structure or union 
    array[0]->next = NULL;   //request for member ‘next’ in something not a structure or union 


    // Do something with the data at hand 
    // Deallocate memory using function free 

    return 0; 
} 

Trả lời

10

đây:

list_node_t **array[10] = {NULL}; 

Bạn đang tuyên bố một mảng 10 con trỏ để trỏ đến struct của bạn. Những gì bạn muốn là một mảng 10 con trỏ đến struct của bạn:

list_node_t *array[10] = {NULL}; 

Đó là khó hiểu bởi vì vâng, array thực sự là một con trỏ đến một con trỏ, nhưng khung vuông ký hiệu loại tóm tắt mà đi cho bạn trong C, và vì vậy bạn nên nghĩ về array như một mảng con trỏ.

Bạn cũng không cần phải sử dụng các toán tử tham chiếu trên dòng này:

*array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 

Bởi vì C dereferences điều đó cho bạn với ký hiệu khung của nó. Vì vậy, nó nên là:

array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 
+4

Đó là câu trả lời hay, ngoại trừ 'mảng' là ** không **" thực sự là một con trỏ tới con trỏ ". 'mảng' thực sự là một mảng, không phải là một con trỏ của bất kỳ loại nào. Các loại mảng khi được sử dụng trong một biểu thức được đánh giá đến một con trỏ đến phần tử đầu tiên của mảng, nhưng một mảng vẫn là một kiểu thực, khác biệt với các con trỏ. 'mảng sizeof' sẽ giúp thuyết phục bạn rằng' mảng' không phải là một con trỏ. – caf

+0

thay vì 'mảng [0] = (list_node_t *) malloc (sizeof (list_node_t));' nó phải là 'mảng [0] = malloc (sizeof (list_node_t));' Không typecast malloc cuộc gọi. –

2

Dòng list_node_t **array[10] = {NULL}; là sai - đây bạn khai báo mảng các con trỏ để trỏ đến danh sách các nút. Thay thế bằng:

list_node_t *array[10] = { NULL }; 

và nó sẽ hoạt động.

Các vấn đề liên quan