2010-11-13 103 views
15

Tôi đang gặp sự cố khi khởi tạo một mảng cấu trúc. Tôi không chắc chắn nếu tôi làm điều đó đúng bởi vì tôi nhận được "khởi tạo từ loại con trỏ không tương thích" & "gán từ loại con trỏ không tương thích". Tôi thêm vào trong mã nơi tôi nhận được những cảnh báo này, và khi tôi cố gắng để in các dữ liệu từ các struct tôi chỉ nhận rác như @@ ​​###C - khởi tạo mảng các cấu trúc

typedef struct 
{ 
    char* firstName; 
    char* lastName; 
    int day; 
    int month; 
    int year; 

}student; 

// khởi tạo mảng

student** students = malloc(sizeof(student)); 
    int x; 
    for(x = 0; x < numStudents; x++) 
    { 
     //here I get: "assignment from incompatible pointer type" 
     students[x] = (struct student*)malloc(sizeof(student)); 
    } 

    int arrayIndex = 0; 

// thêm struct

//create student struct 
     //here I get: "initialization from incompatible pointer type" 
     student* newStudent = {"john", "smith", 1, 12, 1983}; 

     //add it to the array 
     students[arrayIndex] = newStudent; 
     arrayIndex++; 
+1

Mã của bạn có vẻ là một nửa giữa việc tạo động một mảng các cấu trúc sinh viên và tự động tạo một mảng con trỏ tới cấu trúc sinh viên và sau đó tự động tạo từng cấu trúc sinh viên được trỏ tới. Nó không rõ ràng mà bạn đang cố gắng làm, mà làm cho trả lời này khó khăn. –

Trả lời

25
student** students = malloc(sizeof(student)); 

Không, không, không!

Bạn không muốn số **. Bạn muốn có một * và đủ không gian cho bao nhiêu sinh viên bạn cần

student* students = malloc(numStudents * sizeof *students); 
for (x = 0; x < numStudents; x++) 
{ 
    students[x].firstName = "John"; /* or malloc and strcpy */ 
    students[x].lastName = "Smith"; /* or malloc and strcpy */ 
    students[x].day = 1; 
    students[x].month = 12; 
    students[x].year = 1983; 
} 
+1

Chắc chắn bạn có nghĩa là sinh viên * sinh viên = malloc (numStudents * sizeof (sinh viên)) ', phải không? – GnP

+1

@GnP: Tôi thích sử dụng chính đối tượng đó làm đối số cho toán tử 'sizeof'. Với 'struct something * ptr;', hãy áp dụng toán tử vào kiểu (đã được đặt dấu ngoặc đơn) 'struct something' hoặc đối tượng' * ptr' có cùng giá trị. 'sizeof * ptr == sizeof (cấu trúc gì đó)'. – pmg

+0

Xin cảm ơn @prng. Tôi đã nhầm lẫn bởi cú pháp cho đến khi tôi nhận ra 'sizeof' là một toán tử đơn và không phải là hàm trong C. – GnP

2
student* students = malloc(sizeof(student)*numStudents); 
int x; 
for(x = 0; x < numStudents; x++) 
{ 
    student newStudent = {"john", "smith", 1, 12, 1983}; // string copy are wrong still 
    students[x] = newStudent; 
} 
7

Không liên quan đến những lời cảnh báo trình biên dịch, nhưng malloc ban đầu của bạn là sai; bạn muốn:

malloc(sizeof(student *)* numStudents) 

Để cấp phát tổng số điểm 'numStudents' cho sinh viên. Điểm mấu:

students[x] = (struct student*)malloc(sizeof(student)); 

nên là:

students[x] = (student*)malloc(sizeof(student)); 

Không có những điều như 'sinh viên struct'. Bạn đã khai báo một cấu trúc chưa đặt tên và đã gõ nó vào 'student'. So sánh và tương phản với:

struct student 
{ 
    char* firstName; 
    char* lastName; 
    int day; 
    int month; 
    int year; 

}; 

Trong đó sẽ tạo ra một loại 'sinh viên struct' nhưng yêu cầu bạn (trong C) để rõ ràng đề cập đến struct sinh viên chứ không phải chỉ đơn thuần là sinh viên ở nơi khác. Quy tắc này được thay đổi cho C++, do đó trình biên dịch của bạn có thể hơi mờ về nó.

Đối với:

student* newStudent = {"john", "smith", 1, 12, 1983}; 

Đó nên là:

student newStudent = {"john", "smith", 1, 12, 1983}; 

Là cú pháp cú đúp xoăn là một trực tiếp theo nghĩa đen, không phải cái gì ở một nơi khác mà bạn cần phải trỏ đến.

EDIT: trên phản ánh, tôi nghĩ rằng aaa có thể đã lấy nhiều hơn một tổng quan về điều này hơn tôi có. Có thể bạn vô tình sử dụng một mức độ dereference con trỏ ở khắp mọi nơi? Vì vậy, bạn muốn:

student* students = malloc(sizeof(student) * numStudents); 

/* no need for this stuff: */ 
/*int x; 
for(x = 0; x < numStudents; x++) 
{ 
    //here I get: "assignment from incompatible pointer type" 
    students[x] = (struct student*)malloc(sizeof(student)); 
}*/ 

int arrayIndex = 0; 

Và:

student newStudent = {"john", "smith", 1, 12, 1983}; 

//add it to the array 
students[arrayIndex] = newStudent; 
arrayIndex++; 

Đối tượng mảng không được sử dụng bên ngoài phạm vi của newStudent. Nếu không, việc sao chép các con trỏ tới các chuỗi là không chính xác.

-1

Khi khởi tạo, nó không giống như thế này?

student** students = (struct student**)malloc(sizeof(student*)*numStudents); 

Tuy nhiên, tại sao trỏ đến con trỏ? Chỉ cần với một con trỏ để cấu trúc là đủ tôi nghĩ.

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