【问题标题】:Where is my segmentation fault occuring?我的分段错误发生在哪里?
【发布时间】:2017-08-05 11:51:21
【问题描述】:

我对 C 很陌生,所以如果这是一个愚蠢的问题,我深表歉意。我遇到了分段错误,当我运行 gdb 时,我没有像往常一样获得行号来演示导致错误的原因。相反,我得到了一些类似的东西:

find_any_ptr()中的0x00000000004012ff

我正在编写一个方法来返回指向给定stringstop 中任何字符的第一次出现的指针,如果string 不包含任何字符,则返回NULL

char *find_any_ptr(char *string, char* stop){
    char* ch1 = string;
    char* ch2 = stop;
    int retComp = strlen(string);
    char* retChar;
    while(*ch2 != '\0'){
        int temp = 0;
        while(*ch1 != '\0'){
            if(*ch2 == *ch1){
                if(temp < retComp){
                    *retChar = ch1;
                    retComp = temp;
                }
            }
            temp++;
            ch1++;
        }
        ch2++;
    }
    if(retComp == strlen(string)){
        return NULL;    //NULL has been defined elsewhere
    }else{
        return retChar;
    }
}

如果有人发现根本问题出在哪里,我将非常感谢您的帮助。 :) 谢谢!

【问题讨论】:

  • 崩溃发生在*retChar = ch1,因为retChar 是一个未初始化的指针。在命令行上用-Wall 编译,你的编译器应该会告诉你这样的事情。 (你可能打算写retChar = ch1
  • 除了崩溃之外,在我看来,您正在倒退算法,您的外部循环应该在string 的字符上,内部循环在stop 上。您不需要所有这些临时变量,当您第一次找到匹配的字符时,您可以立即将指针返回到您在string 中的位置。如果你到达循环的末尾,这意味着你没有发现任何好的东西,所以你必须返回 NULL。
  • 在运行 gdb 之前,您是否使用 -g 标志进行编译?

标签: c segmentation-fault gdb


【解决方案1】:

以下声明:

*retChar = ch1;

导致分段错误,因为您试图取消引用未初始化的指针;为避免这种情况,您应该将该语句更改为:

retChar = ch1;

该语句将ch1的地址存储在retChar中,而不是存储在ch1中的char值;这可能是你想要做的。

【讨论】:

  • 您所建议的new char 仅用于泄漏内存。
  • @MatteoItalia 刚刚编辑了我的帖子,抱歉,我没有注意到。感谢您指出这一点!
【解决方案2】:

*retChar = ch1; 更改为retChar = ch1; 即。当 retChar 指针未初始化为某个对象时,您正在取消对它的引用,并且您可能只是希望它分配 ch1 指针的值(地址不是它指向的字符)。

【讨论】: