2014-09-12 17 views
5

Vì vậy, tôi có lỗi rất lạ mà tôi không thể hiểu được. Tôi đang chạy vòng lặp và kiểm tra giá trị NULL sau đó tôi giả sử để chấm dứt vòng lặp. Nhưng, tôi nhận được một số vấn đề EXC_BAD_ACCESS sau khi tôi có các giá trị sau (như bạn có thể nhìn thấy trên ảnh chụp màn hình)Cần trợ giúp để hiểu những gì đang xảy ra trong chương trình C

Đây là thêm đoạn mã mà trả về char chuỗi

char *TKGetNextToken(TokenizerT *tk) { 

    if((*tk).currentToken) 
     return *(*tk).currentToken++; 
    else 
     return NULL; 

} 

hạn và cơ cấu thực tế

struct TokenizerT_ { 
    char **currentToken; 
    char **tokens; 
}tokenizer; 

Và đó là những gì tôi có cho con trỏ của tôi:

char **words; 
words = (char **)malloc(sizeof(char*) * numberOfWords); 
for (int i = 0; i < numberOfWords; i++) 
words[i] = (char *)malloc(strlen(ts)+1); 

tokenizer.tokens = words; 
tokenizer.currentToken = words; 

Tôi không biết tại sao lỗi này có thể xảy ra và tại sao. Bởi vì chúng tôi có thể có một trong hai con trỏ trỏ đến một nơi nào đó hoặc giá trị NULL ... enter image description here

+1

Bạn cũng nên kiểm tra '* (* tk) .currentToken' trước khi bạn tăng nó. – Sheljohn

+2

Và bạn sẽ không thoát khỏi giới hạn của 'currentToken'? Làm thế nào để bạn tạo ra tất cả những con trỏ? –

+1

"_Tôi không biết tại sao lỗi này có thể xảy ra_" - Điển hình khi bạn có con trỏ trỏ đến không có bộ nhớ. – JosEduSol

Trả lời

0

Ok. Tôi đã sửa mã của mình nhờ Joachim và JosEdu. words = (char **) malloc (sizeof (char *) * numberOfWords); cần sốOfWords + 1 Bởi vì khi tôi đi ra khỏi giới hạn và kiểm tra giá trị null nó chỉ có một số đoạn không được phân bổ bộ nhớ và tôi đang gặp rắc rối.

1

Kiểm tra TKGetNextToken của bạn cho NULL không bao giờ có mặt. Thêm mục NULL vào cuối:

words = (char **)malloc(sizeof(char*) * (numberOfWords +1)); 
for (int i = 0; i < numberOfWords; i++) 
    words[i] = (char *)malloc(strlen(ts)+1); 
words[i] = NULL; 
Các vấn đề liên quan