如何在C中为声明之外的字符串赋值?总线错误/分段故障

如何在C中为声明之外的字符串赋值?总线错误/分段故障,c,string,macos,unix,segmentation-fault,C,String,Macos,Unix,Segmentation Fault,我正在尝试重新编写一个相当于strstrstr()函数的strstr()函数,经过几次尝试,我得到了正确的结果,代码如下: (我知道有比我更简单的方法,但这次我想尝试使用第三个字符串来存储事件) 我得到了我想要的输出: tmp = Point123 ret = Point123 但为了确保我尝试了更长的字符串,这就是问题的开始。 这是我试过的绳子 char a[] = "test Point123456789"; char b[] = "Point123456789"; 我得到的结果是: t

我正在尝试重新编写一个相当于strstrstr()函数的
strstr()
函数,经过几次尝试,我得到了正确的结果,代码如下:

(我知道有比我更简单的方法,但这次我想尝试使用第三个字符串来存储事件)

我得到了我想要的输出:

tmp = Point123
ret = Point123
但为了确保我尝试了更长的字符串,这就是问题的开始。 这是我试过的绳子

char a[] = "test Point123456789";
char b[] = "Point123456789";
我得到的结果是:

tmp = Point123456?"1
ret = Point123456?"1
Abort trap: 6
对于较长的字符串,有时会出现segfault,有时会出现总线错误10。 在另一篇文章中,我发现总线错误10有时会取代mac OS上的segfault(我第一次在上面编写代码,我习惯在linux上编写代码),我没有发现关于陷阱tho的任何信息

无论如何,我认为这更像是一个代码问题,我的编译器和我想知道为什么我的代码在较小的字符串上运行,而不是在较大的字符串上运行,我读到这可能是我如何影响我正在使用的字符串的值,但我不明白我在哪里出错

因此,如果有人能告诉我我做错了什么,我将不胜感激:)

编辑

我遵循了评论中的建议,这是我修复后的功能,现在运行正常thx

(再说一次,我知道我不需要tmp,还有很多其他更简单、更快的方法——这是指培训(显然我需要^^))


您没有为
tmp
分配内存,因此使用
tmp[j]
您正在写入未分配给您的某个随机内存位置。然后这个位置可能会被你所做的事情再次覆盖

字符串越长,内存位置就越乱


幸运的是,您得到了一些字符串更短的结果。

在代码中,
tmp
是函数
my_strstr()
的自动局部变量。它没有显式初始化,因此它包含不确定值

在代码的后面,您将直接编写

 tmp[j] = s1[i];
使用(取消引用)
tmp
uninitialized意味着您试图访问无效的内存位置(记住“非确定值”),这可能无法从您的应用程序访问。它调用

解决方案:在访问(取消引用)tmp之前,需要将内存分配给tmp


编辑:


但是,根据下面的说明,您的
my_strstr()
逻辑也有缺陷。当您递增
j
(搜索字符串的索引)并发现两者之间不匹配时,您不会将其重新设置为
0
。也许你想再看一眼,然后纠正同样的错误。

啊,是的,我把它弄坏了,这是有效的,thx我应该知道的快速回答,我被它第一次起作用的事实弄糊涂了。我根本不知道你所说的宗教价值。@Zoubro,不客气。关于不确定性值,每个自动局部变量值都是不确定性的,除非显式初始化。:-)好的,这很好,这个值取决于变量的类型,它总是相同的还是随机的?@Zoubro总是不确定的,除非初始化,不管类型。@Sourav Ghosh不,他不需要为tmp分配内存。他根本不应该使用tmp。但无论如何,他的功能是错误的。你能删除行号吗?如果每一行都以数字开头,则很难通过编译器运行代码。
char *my_strstr(char *s1, char *s2)
{
  int i, j;
  char *tmp;
  i = (j = 0);
  tmp = malloc(sizeof(strlen(s2)));
  if (s1 != '\0' && s2 != '\0')
    {
      while (s1[i] != '\0' && s2[j] != '\0')
        {
          if (s1[i] == s2[j])
            {
              tmp[j] = s1[i];
              j++;
            }
          else
            j = 0;
          i++;
        }
    }
  return (tmp);
}
 tmp[j] = s1[i];