Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的分段错误发生在哪里?_C_Segmentation Fault_Gdb - Fatal编程技术网

C 我的分段错误发生在哪里?

C 我的分段错误发生在哪里?,c,segmentation-fault,gdb,C,Segmentation Fault,Gdb,我对C非常陌生,所以如果这是一个愚蠢的问题,我很抱歉。我得到了一个分段错误,当我运行gdb时,我没有像通常那样得到一个行号来证明是什么导致了错误。取而代之的是,我得到了如下线索: 查找任何ptr中的0x00000000004012ff 我正在编写一个方法,返回一个指针,指向给定字符串中stop中第一个出现的任何字符,如果字符串不包含任何字符,则返回NULL char *find_any_ptr(char *string, char* stop){ char* ch1 = string;

我对C非常陌生,所以如果这是一个愚蠢的问题,我很抱歉。我得到了一个分段错误,当我运行gdb时,我没有像通常那样得到一个行号来证明是什么导致了错误。取而代之的是,我得到了如下线索:

查找任何ptr中的0x00000000004012ff

我正在编写一个方法,返回一个指针,指向给定字符串中stop中第一个出现的任何字符,如果字符串不包含任何字符,则返回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;
    }
}

如果有人看到根本问题所在,我将非常感谢您的帮助谢谢大家!

Change*retChar=ch1;retChar=ch1;例如,当retChar指针未初始化为某个对象时,您正在取消对它的引用,您可能只希望它将ch1指针的值分配给地址,而不是它所指向的字符

以下声明:

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

retChar = ch1;

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

崩溃发生在*retChar=ch1,因为retChar是未初始化的指针。在命令行上使用-Wall进行编译,编译器应该告诉您类似的事情。你可能是想写retChar=ch1除了崩溃,在我看来,你是在倒退算法,你的外循环应该是字符串字符,内循环结束停止。您不需要所有这些临时变量,当您第一次找到匹配的字符时,您可以立即将指针返回到字符串中的位置。如果你在循环结束时得到,这意味着你没有发现任何好的结果,因此你必须返回NULL。你在运行gdb之前是否在编译时启用了-g标志?你建议的新字符除了泄漏内存之外没有其他用途。@MatteoItalia刚刚编辑了我的文章,对不起,我没有注意到这一点。谢谢你指出这一点!