地址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
(akanull
)读取1字节,这将无法工作。。。因此,currentFile
或fileToCheck
都是NULL
在线414
。。。(很可能是当前文件)我也不会这样做。我将搜索WORD
公告,一旦找到,分配空间来容纳行的其余部分,然后使用sscanf
和%s
将单词标记的前导和尾随空格忽略(因为sscanf
将自动执行此操作)。无论如何,想想你需要的状态,以及什么可以/应该被忽略或触发状态改变。在编写一行代码之前,这正是您应该关注的地方。
sscanf(strchr(curr, ' '), "%s", currentWord);
sscanf(strchr(curr, ' '), "%s", currentFile);
sscanf(strchr(curr, ' '), "%s", p);