地址0x0不是堆栈';d、 马洛克';d或(最近)免费';d在C中

地址0x0不是堆栈';d、 马洛克';d或(最近)免费';d在C中,c,linux,segmentation-fault,valgrind,free,C,Linux,Segmentation Fault,Valgrind,Free,我正在开发一个程序,可以从一个文件中读取行,并通过操作来检索信息。有关文件是: WORD abc TOTAL 10 FILE /home/user/Scrivania/find/try OCCURRENCES 2 0 0 1 0 FILE /home/user/Scrivania/find/try1 OCCURRENCES 2 3 0 4 0 FILE /home/user/Scrivania/prova/prova1/prova3/try3 OCCURRENCES 3 2 0 3 0 4 0

我正在开发一个程序,可以从一个文件中读取行,并通过操作来检索信息。有关文件是:

WORD abc
TOTAL 10
FILE /home/user/Scrivania/find/try
OCCURRENCES 2
0 0
1 0
FILE /home/user/Scrivania/find/try1
OCCURRENCES 2
3 0
4 0
FILE /home/user/Scrivania/prova/prova1/prova3/try3
OCCURRENCES 3
2 0
3 0
4 0
FILE /home/user/Scrivania/prova/try4
OCCURRENCES 3
2 0
3 0
4 0
WORD ac
TOTAL 10
FILE /home/user/Scrivania/find/try
OCCURRENCES 3
2 0
3 0
4 0
FILE /home/user/Scrivania/find/try1
OCCURRENCES 3
0 0
1 0
2 0
FILE /home/user/Scrivania/prova/prova1/prova3/try3
OCCURRENCES 2
0 0
10
FILE /home/user/Scrivania/prova/try4
OCCURRENCES 2
0 0
1 0
我使用这种方法:

void getWordOccurences(char *word, char *file, char *fileToCheck){
    FILE *f;
    char *curr = NULL;
    size_t len = 0;
    ssize_t line_size;
    char *currentWord = NULL;
    char *currentFile = NULL;
    char *p = NULL;
    int check = 0;

    if(fileToCheck == NULL){
        printf("Pass a file as arguments\r\n");
    }else{
        f = fopen(file, "r");
        if(f == NULL){
            fprintf(stderr, "Cannot open %s, exiting. . .\n", file);
            exit(1);
        }
        while((line_size = getline(&curr, &len, f)) != -1){
            trimTrailing(curr);
            if(curr[0] == 'W'){
                currentWord = (char*)malloc((strlen(curr)+1)*sizeof(char));
                strcpy(currentWord, strchr(curr, ' '));
                currentWord++;
                continue;
            }
            if(curr[0] == 'F'){
                currentFile = (char*)malloc((strlen(curr)+1)*sizeof(char));
                strcpy(currentFile, strchr(curr, ' '));
                currentFile++;
                continue;
            }
            if(curr[0] == 'O'){
                p = (char*)malloc((strlen(curr)+1)*sizeof(char));
                strcpy(p, strchr(curr, ' '));
                p++;
                continue;
            }
            if(strcmp(currentWord, word) == 0){
                if(strcmp(currentFile, fileToCheck) == 0){ // LINE 414
                    if(atoi(p) > 0){
                        check = 1;
                        printf("%s \n", curr);
                        continue;
                    }
                }         
            }
        }

        if(check == 0){
            printf("The word %s doesn't occur in the file %s \n", word, fileToCheck);
        }
        fclose(f);
    }
}
我将参数作为输入参数传递给这个方法。变量
word
store to word to search、
file
存储要打开的文件的路径(在本例中,上面显示的文件)和
fileToCheck
是要在文件中搜索的文件路径(紧跟在
file
之后的路径)

我可以在变量
word
中传递我想要的每个字符串作为输入参数,除了
abc
。只有当我通过abc时,我才能得到:(valgrind正在运行)

我不明白为什么只有在我将
abc
作为参数传递时才会发生这种情况。 在main方法中,我只调用此函数,没有其他调用:

int main(int argc, char * argv[]){
      getWordOccurences(argv[1], argv[2], argv[3]);

      return 0;
}
正在运行的命令是:

valgrind myprog abc inputFile /home/users/Scrivania/find/try

我知道这是由第414行中的空指针引起的,但为什么我要传递“ac”它有效,而不是“abc”?

为了解决这个问题,我在底部的三个if中添加了一个控件:

if(currentWord != NULL && (strcmp(currentWord, word) == 0)){
     if(currentFile != NULL && (strcmp(currentFile, fileToCheck) == 0)){
          if(p != NULL && (atoi(p) > 0)){
                check = 1;
                printf("%s \n", curr);
                continue;
           }
     }         
}
我还更改了代码的以下部分:

strcpy(currentWord, strchr(curr, ' '));
currentWord++;

strcpy(currentFile, strchr(curr, ' '));
currentFile++;

strcpy(p, strchr(curr, ' '));
p++;
使用这些性能更高的产品线:

sscanf(strchr(curr, ' '), "%s", currentWord);
sscanf(strchr(curr, ' '), "%s", currentFile);
sscanf(strchr(curr, ' '), "%s", p);

currentWord++
currentFile++
p++这些行应该做什么?我不明白程序试图完成什么。您不能
strcmp
空指针。valgrand指出您正在尝试从地址
0x0
(aka
null
)读取1字节,这将无法工作。。。因此,
currentFile
fileToCheck
都是
NULL
在线
414
。。。(很可能是当前文件)我也不会这样做。我将搜索
WORD
公告,一旦找到,分配空间来容纳行的其余部分,然后使用
sscanf
%s
将单词标记的前导和尾随空格忽略(因为
sscanf
将自动执行此操作)。无论如何,想想你需要的状态,以及什么可以/应该被忽略或触发状态改变。在编写一行代码之前,这正是您应该关注的地方。
sscanf(strchr(curr, ' '), "%s", currentWord);
sscanf(strchr(curr, ' '), "%s", currentFile);
sscanf(strchr(curr, ' '), "%s", p);