1

我正在创建一个程序来打开给定目录中的 .txt 文件,我有一个数组,其中包含相关目录中文件的所有绝对路径,并且我正在创建一个函数来提取并返回文件的名称,函数编写如下:

char *name(char *string) {
    int i = strlen(string);
    char *aux;
    while(string[i-1] != '/'){
        i--;
    }
    strcpy(aux, &string[i]); 
    return aux;
}

上面的函数给出了一个 Segmentation Fault 错误,但如果我添加以下行“int j = 0;” 在 aux 声明之前,错误消失了,新的和工作的代码是

char *name(char *string) {
    int i = strlen(string);
    int j = 0;
    char *aux;
    while(string[i-1] != '/'){
        i--;
    }
    strcpy(aux, &string[i]); 
    return aux;
}

输入:C:\test\a.txt
输出:a.txt

为什么要添加“int j = 0;” 解决问题?我坚持这一点,无法继续,因为我不知道这种不一致是否会在以后导致更大的问题,我正在考虑编写自己的函数来复制字符串,但在此之前我真的很想了解错误。

4

3 回答 3

4

你从不分配aux. aux在尝试将任何内容复制到它之前,需要指向一个有效的内存位置。

而不是char *aux,你需要类似的东西char *aux = malloc(i+1);。请注意,这i+1是矫枉过正的,因为在您的情况下,它总是比(它不包含)aux短至少 3 个字符,但您可能不关心这么小的字符串。完成后请记住指针。stringC:\free()

此外,您发现它可以通过切换声明顺序和/或添加声明来工作的原因可能是您很幸运,并且以某种方式aux指向的位置是有效的(如果您这样做char *aux;,则aux指向随机位置)。然而,这纯粹是运气,即使它似乎有效,它仍然是无效的代码。

将来,您可能希望使用Valgrind之类的工具来帮助您诊断内存问题。您还应该阅读有关 C 中基本内存管理和指针的教程。

于 2012-07-01T04:05:59.537 回答
3

由于听起来您只对使用字符串的文件名部分作为参数感兴趣,因此另一种选择是使用您已经拥有的字符串部分。

试试: aux = &string[i]; 而不是strcpy。

这为您提供了一个指向您感兴趣的字符串部分的指针(即最后一个“/”之后的最后一部分)。

其次,确保在所有输入字符串中都有一个“/”,否则会发生不好的事情(即,您的循环将超出字符串的开头,可能在某些时候遇到分段错误)。最好在循环上设置一个条件,使其不会继续超过 i = 1。

于 2012-07-01T04:22:54.560 回答
1

您没有分配任何内存到aux. 您正在尝试通过未初始化的指针写入内存。

于 2012-07-01T04:08:10.213 回答