重写代码更清晰
void indexe(char * line, unsigned ref) {
unsigned i = 0;
char word[128]; //(1)
//char * word; //(2)
while(*line) {
if(isalpha(*line))
word[i++] = *line; //(1)
//*word++ = *line; //(2)
*line++;
}
}
int main(int argc, const char * argv[]) {
char line[128];
FILE * f = fopen(argv[1], "r");
unsigned x = 0;
while (fgets(line, 128, f)){
indexe(line, ++x);
}
fclose(f);
return 0;
}
您好,我已尝试过以上两种组合:
word[] -> word[i++]
*word -> *word++
整个过程完美无缺,除非达到EOF,在这种情况下,指针语法会因分段错误而失败,但不会出现数组语法。
我是一个C初学者,有人可以用初学者的术语解释这里发生了什么,并且可能建议一个解决方法来修复指针语法? (但请大多解释一下)
答案 0 :(得分:2)
此版本已发布,很好:
void indexe(char * line, unsigned ref) {
unsigned i = 0;
char word[128]; //(1)
//char * word; //(2)
while(*line) {
if(isalpha(*line))
word[i++] = *line; //(1)
//*word++ = *line; //(2)
*line++;
}
}
但是,如果您推荐使用标记为//(2)的行代码,则可以使用以下代码:
char * word; //(2
*word++ = *line; //(2)
这只是写入未使用已分配内存初始化的指针的情况。这是不允许的。您需要将其保留为数组,或使用malloc
之类的内容来保留存储空间。如果你想在不使用数组的情况下编写函数,代码将是:
char *word = malloc(128); // reserve 128 bytes
if (word == NULL) { // these checks are important
fprintf(stderr, "Cannot allocate memory!");
exit(EXIT_FAILURE);
}
...other stuff...
free(word);
另请注意:
*line++;
增加line
,但无理由地取消引用它(在它递增之前)。
答案 1 :(得分:0)
指针语法失败,因为您已经定义了指针char * word;
,但您没有将其设置为指向任何数据 - 您指向的内存可以是任何位置。因此,当您执行以下语句时:
*word++ = *line;
您将line
指向的值存储在word
指向的值中。不幸的是,您不知道word
指向的位置。正如@teppic指出的那样,你正在写一个尚未初始化为已分配内存的指针。
你可以像@teppic先前指出的那样将那个记忆作为malloc。您还可以执行以下操作:
char reserve[128];
char * word = reserve; // could also have used &reserve[0]
希望有所帮助!