C 返回字符时出现分段错误*

C 返回字符时出现分段错误*,c,pointers,C,Pointers,当行返回str+i-j时,为什么该程序会导致分段错误是否遇到?我原以为我对指针的概念理解得很好,但我显然错过了一些东西,我无法理解 #include <stdio.h> char* ft_strstr(char* str, char* to_find) { int i; int j; i = 0; while (str[i] != '\0') { j = 0; while (str[i] == to_fin

当行
返回str+i-j时,为什么该程序会导致分段错误是否遇到?我原以为我对指针的概念理解得很好,但我显然错过了一些东西,我无法理解

#include <stdio.h>

char* ft_strstr(char* str, char* to_find) 
{
    int i;
    int j;

    i = 0;
    while (str[i] != '\0')
    {
        j = 0;
        while (str[i] == to_find[j] && str[i] != '\0' && to_find[j] != '\0')
        {
            i++;
            j++;
        }
        if (to_find[j] == '\0')
            return str + i - j;
        else
            i = i - j;
        i++;
    }
    return (0);
}

int main()
{
    char a[] = "fffo";
    char b[] = "ffo";
    char* f = ft_strstr(a,b);
    if (f)
        printf("%s\n", f);
    return (0);
}
#包括
char*ft\u strstr(char*str,char*to\u find)
{
int i;
int j;
i=0;
while(str[i]!='\0')
{
j=0;
while(str[i]==to_find[j]&&str[i]!='\0'&&to_find[j]!='\0')
{
i++;
j++;
}
如果(找到[j]='\0')
返回str+i-j;
其他的
i=i-j;
i++;
}
返回(0);
}
int main()
{
字符a[]=“fffo”;
字符b[]=“ffo”;
char*f=ft_strstr(a,b);
如果(f)
printf(“%s\n”,f);
返回(0);
}

如果您想在另一个字符串中找到一个字符串,您只需查看标准的
strstrstr
函数,因为这正是它的用途

但是,如果您的目的是学习如何调试代码,那么最好的办法就是坐下来拿一张纸,这样:

  i        j      str               to_find
-----    -----    --------------    ------------
                  0  1  2  3  4     0  1  2  3  <- indexes
  ?        ?      f  f  f  o  \0    f  f  o  \0
i j str要查找
-----    -----    --------------    ------------

0 1 2 3 4 0 1 2 3如果您在这里的目的是在另一个字符串中查找一个字符串,那么您只需查看标准的
strstr
函数,因为这正是它的用途

但是,如果您的目的是学习如何调试代码,那么最好的办法就是坐下来拿一张纸,这样:

  i        j      str               to_find
-----    -----    --------------    ------------
                  0  1  2  3  4     0  1  2  3  <- indexes
  ?        ?      f  f  f  o  \0    f  f  o  \0
i j str要查找
-----    -----    --------------    ------------

011234040123一切正常。毕竟这和指针无关,我的错,对不起。问题是我实际上有两个单独的文件(main.cpp和ft_strstr.c)。即使未在main.cpp文件中声明
ft_strstr()
的原型,使用
gcc main.cpp ft_strstr.c
进行编译时,链接器也没有出现任何错误,并且在运行编译后的可执行文件时,它似乎导致了分段错误。但奇怪的是,函数正在执行(我知道,因为我试图从
ft\u strstrstr()
)进行一些打印)。

一切正常。毕竟这和指针无关,我的错,对不起。问题是我实际上有两个单独的文件(main.cpp和ft_strstr.c)。即使未在main.cpp文件中声明
ft_strstr()
的原型,使用
gcc main.cpp ft_strstr.c
进行编译时,链接器也没有出现任何错误,并且在运行编译后的可执行文件时,它似乎导致了分段错误。但奇怪的是,函数正在执行(我知道,因为我试图从
ft\u strstrstr()
)进行一些打印)。

那里没有
返回0
?这看起来很可疑……在GCC编译器中,您的程序运行良好。@cuvidk:我现在无法测试它,但您当前的代码看起来不错。你可以调试它,看看
i
j
的值是什么,以及它们是如何变化的。你没有
返回0
吗?这看起来很可疑……在GCC编译器中,您的程序运行良好。@cuvidk:我现在无法测试它,但您当前的代码看起来不错。你可以调试它,看看
i
j
的值是什么,以及它们是如何变化的。我知道有一个函数已经做到了这一点。这就是为什么这个函数的原型与那个函数如此相似。我只需要写一些类似的东西,就这样。其次,在本例中不调用返回(0)
。遇到的return语句是
returnstr+i-j。检查打印件,您将看到。和关于
返回(0)
,它是故意放在那里的,因为
中的
str
函数在未找到序列时返回
NULL
指针。@cuvidk,我只是说,由于您盲目地
printf
返回值,如果找不到字符串,返回值将很糟糕,因此,我声明您的呼叫代码应该考虑到这一点。我会尽量说清楚的。它本身并不是函数的问题。为了确定函数的问题,您需要调试技巧,我正试图传授:-)我更改了它:DAnd,现在,我已将答案更改为适合:-)FWIW,这在我的gcc和我的头脑中都起作用,因此您可能希望确保您发布/正在编译正确的代码。我知道有一个函数已经做到了这一点。这就是为什么这个函数的原型与那个函数如此相似。我只需要写一些类似的东西,就这样。其次,在本例中不调用返回(0)
。遇到的return语句是
returnstr+i-j。检查打印件,您将看到。和关于
返回(0)
,它是故意放在那里的,因为
中的
str
函数在未找到序列时返回
NULL
指针。@cuvidk,我只是说,由于您盲目地
printf
返回值,如果找不到字符串,返回值将很糟糕,因此,我声明您的呼叫代码应该考虑到这一点。我会尽量说清楚的。它本身并不是函数的问题。为了确定函数的问题,您需要调试技巧,我正在尝试传授:-)我更改了它:DAnd,现在,我已经更改了我的答案以适应:-)FWIW,它在我的gcc和我的头脑中都起作用,因此您可能希望确保发布/编译了正确的代码。