与strcpy甚至更奇怪的解决方案C奇怪的错误

时间:2012-07-01 04:03:31

标签: c segmentation-fault strcpy

我正在创建一个程序来打开给定目录中的.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;”解决了这个问题?我坚持下去并且无法继续,因为我不知道这种不一致是否会导致更大的问题,我正在考虑编写自己的函数来复制字符串,但在此之前我真的想要理解错误。

3 个答案:

答案 0 :(得分:4)

您永远不会分配aux。在尝试将任何内容复制到其中之前,aux需要指向有效的内存位置。

而不是char *aux,您需要char *aux = malloc(i+1);之类的内容。请注意,i+1过度,因为在您的情况下aux总是至少比string短3个字符(它不会包含C:\),但您可能不会关心这么小的字符串。一旦你完成它,请记住free()指针。

此外,你发现它通过切换声明的顺序和/或添加声明的原因可能是你很幸运,并且aux指向的位置在某种程度上是有效的(如果你只是{{ 1}},char *aux;指向随机位置)。然而,这是纯粹的运气,并且仍然是无效代码,即使它似乎有效。

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

答案 1 :(得分:3)

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

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

这会给你一个指向你感兴趣的字符串部分的指针(即最后的'/')之后的最后一部分。

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

答案 2 :(得分:1)

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