2011-10-23 72 views
6

Tôi đã tìm thấy câu trả lời hữu ích về câu hỏi của người khác vô số lần ở đây trên stackoverflow, nhưng đây là lần đầu tiên tôi đặt câu hỏi của riêng mình.Phân bổ động của một mảng các cấu trúc

Tôi có hàm C cần phân bổ không gian cho một mảng cấu trúc và sau đó điền các thành phần cấu trúc của mỗi phần tử mảng với các giá trị được lấy từ một tệp. Việc phân công thành viên hoạt động tốt trên lần đầu tiên của vòng lặp, nhưng tôi nhận được một lỗi phân đoạn trên vượt qua thứ hai.

Tôi đã viết lên chương trình nhanh chóng này minh họa các yếu tố cần thiết của vấn đề tôi đang gặp:

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

typedef struct { 
     int a; 
     int b; 
} myStruct; 

void getData(int* count, myStruct** data) { 
    *count = 5; 
    *data = malloc(*count * sizeof(myStruct)); 

    int i; 
    for (i = 0; i < *count; i++) { 
     data[i]->a = i; 
     data[i]->b = i * 2; 
     printf("%d.a: %d\n", i, data[i]->a); 
     printf("%d.b: %d\n", i, data[i]->b); 
    } 
} 

int main() { 
    int count; 
    myStruct* data; 
    getData(&count, &data); 
    return 0; 
} 

Kết quả tôi nhận được từ này là:

0.a: 0 
0.b: 0 
Segmentation fault 

Tôi không chắc chắn nơi mà vấn đề của tôi nằm. Dường như cuộc gọi malloc chỉ phân bổ đủ không gian cho một cấu trúc khi cần phân bổ không gian cho năm.

Mọi trợ giúp sẽ được đánh giá rất nhiều.

Trả lời

6

Lỗi là ở đây:

for (i = 0; i < *count; i++) { 
    data[i]->a = i; 
    data[i]->b = i * 2; 
    printf("%d.a: %d\n", i, data[i]->a); 
    printf("%d.b: %d\n", i, data[i]->b); 
} 

bạn nên làm điều này:

for (i = 0; i < *count; i++) { 
    (*data)[i].a = i; 
    (*data)[i].b = i * 2; 
    printf("%d.a: %d\n", i, (*data)[i].a); 
    printf("%d.b: %d\n", i, (*data)[i].b); 
} 

Lý do là bạn đang lập chỉ mục "chiều" sai của data.

+0

Bạn cần phải dereference 'dữ liệu' trong printfs quá – MahlerFive

+0

Có, bạn đã đúng. Đã sửa. – Mysticial

+0

Cảm ơn phản ứng cực kỳ nhanh chóng! –

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