【问题标题】:C strange error with strcpy and even stranger solutionstrcpy的C奇怪错误甚至更奇怪的解决方案
【发布时间】:2012-07-02 00:42:26
【问题描述】:

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

【问题讨论】:

  • aux 未初始化。首先使用 malloc。
  • 我发现的另一个解决方案是交换声明“int i = strlen(string);”的顺序和 "char *aux;"
  • @user1493813,这些不是解决方案。这是未定义的行为。
  • 另外,另一个注意事项,您的输入指定反斜杠,而您的循环正在寻找正斜杠。除了找到正斜杠之外,您没有任何循环终止符,因此您也应该对此输入进行段错误。为安全起见,请在 i == 0 时使用支票保释。
  • 支持“无法继续,因为我不知道这种不一致是否会在以后导致更大的问题”,并来这里询问,而不是在找到“有效”的东西后继续。

标签: c segmentation-fault strcpy


【解决方案1】:

你永远不会分配auxaux 需要指向一个有效的内存位置,然后才能尝试将任何内容复制到它。

您需要char *aux = malloc(i+1); 之类的东西,而不是char *aux。请注意,i+1 是多余的,因为在您的情况下,aux 将始终比string 短至少 3 个字符(它不会包含C:\),但您可能不关心这么小的字符串。完成后记得free()指针。

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

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

【讨论】:

  • strcpy 复制空终止符,你绝对需要 (i+1)。
  • @Nick:不,你没有。 aux 总是比 string 短。
  • @Nick:添加解释以防不明显。
  • 是的,我错过了他总是使用绝对路径的部分,谢谢。
  • 非常感谢,我在循环中使用了一个计数器来计算字符数,然后我执行“char *aux = malloc(cont + 1);”,现在我意识到它是这么愚蠢的指针错误,我真的需要注意基础
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多