2014-09-12 198 views
5

所以我有一个非常奇怪的错误,我无法理解。我正在运行循环和检查NULL值,然后我想终止循环。但是,我得到一些EXC_BAD_ACCESS的问题后,我有以下值(正如你所看到的截图)需要帮助了解C程序中发生了什么

这是一个返回字符的字符串

char *TKGetNextToken(TokenizerT *tk) { 

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

} 

和实际结构代码再加上一块

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

而这正是我对我的指点:

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; 

我不知道为什么会出现这个错误,为什么。因为我们可以有指向某处的指针或NULL值... enter image description here

+1

在增加它之前,您应该检查'*(* tk).currentToken'。 – Sheljohn 2014-09-12 23:49:37

+2

你不会超出'currentToken'范围?你如何创建所有这些指针? – 2014-09-12 23:55:56

+1

“_我不知道为什么会出现这个错误。” - 典型的指针指向没有内存。 – JosEduSol 2014-09-13 00:01:54

回答

0

好的。感谢Joachim和JosEdu,我修复了我的代码。 words =(char **)malloc(sizeof(char *)* numberOfWords);需要numberOfWords + 1 因为当我走出界限并检查空值时,它只是有一些没有分配的内存块,我遇到了麻烦。

1

您的TKGetNextToken测试从不存在的NULL。在末尾添加一个NULL条目:

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