2011-10-18 43 views
6

Tôi đang cố gắng để malloc và miễn phí một mảng nhỏ/bảng của chuỗi chữ cái duy nhất. Tôi biết rằng điều này có thể được thực hiện trong một mảng, nhưng tôi muốn thử và làm điều này với một malloc và miễn phí.Làm thế nào để malloc char ** bảng?

Tôi có này ngay bây giờ:

char **letters = (char**) malloc(5 * sizeof(char*)); 
int i =0; 
for(i=0; i < NUMLETTERS ; ++i) 
{ 
    letters[i] = (char*) malloc(2*sizeof(char)); //2 is for the letter and null terminator 
} 

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

//Do stuff here 

int i =0; 
for(i=0; i < 5; ++i) 
{ 
    free(letters[i]); 
} 


free(letters); 

Đoạn mã trên biên dịch tốt và mã của tôi ở giữa cũng làm việc và chạy tốt, nhưng khi chạy nó được một lỗi trong các phần miễn phí. Ngoài ra, sau khi sử dụng valgrind..it nói rằng miễn phí (chữ cái [i]); không hợp lệ.

Bất kỳ trợ giúp nào?

Trả lời

5

Vấn đề là ở đây:

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

Bạn đang ghi đè lên mỗi con trỏ malloc'ed của bạn với xâu. Sau đó, bạn giải phóng chúng trong vòng lặp cuối cùng. Vì bạn có hiệu quả giải phóng các chuỗi ký tự, nó không thành công.

Có hai cách để giải quyết vấn đề này:

1: Bạn không cần phân bổ bên trong nếu bạn chỉ đang chỉ định chuỗi ký tự cho chúng. Vì vậy, thoát khỏi cả hai vòng. Thay vào đó,

2: strcpy mỗi chuỗi ký tự chuỗi.

+0

Ah! Tôi nên làm một cái gì đó như: strcpy (chữ cái [0], "a"); Đúng? – Flipper

+0

Chính xác, điều đó sẽ hiệu quả. – Mysticial

3

Bạn đang phân bổ bộ nhớ chính xác cho mỗi chuỗi trong mảng, nhưng sau đó bạn không sử dụng bộ nhớ đó. Thay vào đó, bạn thay đổi các con trỏ char* trong mỗi trong năm phần tử mảng để trỏ đến các chuỗi ký tự "a", "b", "c", v.v.

Vì vậy, bạn đã mất tham chiếu đến bộ nhớ ban đầu được cấp phát và thay vào đó bạn đang cố gắng giải phóng bộ nhớ không thuộc về bạn.

Thay vì gán con trỏ chuỗi như thế này:

letters[0] = "a"; 

bạn nên sao chép các chuỗi vào bộ nhớ bạn đã được phân bổ như sau:

strncpy(letters[0], "a", 2); 
+0

đối số kích thước phải là 2 để bao gồm '\ 0'. Dưới đây là đoạn trích để chứng minh quan điểm của tôi: 'int main (int argc, char ** argv) { char * str1 =" a "; char str2 [2]; str2 [1] = 0xFF; strncpy (str2, str1, 1); printf ("str2 [0] =% x, str2 [1] =% x \ n", str2 [0] & 0xFF, str2 [1] & 0xFF); } ' –

+0

Đã sửa lỗi ngay bây giờ, cảm ơn. –

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