如何分配一个值在C外的声明字符串?总线错误/段错误



我试图重新编码相当于strstr()函数,经过几次尝试,我得到了正确的,这里的代码:

(我知道有更简单的方法来做到这一点,我做了,但这次我想尝试使用第三个字符串来存储发生)

 char *my_strstr(char *s1, char *s2)
 {
   int i, j;
   char *tmp;
   i = (j = 0);
   if (s1 != '' && s2 != '')
     {
       while (s1[i] != '' && s2[j] != '')
         {
           if (s1[i] == s2[j])
             {
               tmp[j] = s1[i];
               j++;
             }
           i++;
         }
         printf("tmp = %sn", tmp);
     }
   return (tmp);
 }

 int main()
 {
   char a[] = "test Point123";
   char b[] = "Point123";
   char *ret;
   ret = my_strstr(a, b);
   printf("ret = %sn",ret);
   return (0);
 }

我得到了我想要的输出:

tmp = Point123
ret = Point123

但是为了确保,我尝试了一个更长的字符串,这就是问题开始的地方。这里是我尝试的字符串

char a[] = "test Point123456789";
char b[] = "Point123456789";

和我得到的输出:

tmp = Point123456?"1
ret = Point123456?"1
Abort trap: 6

与较长的字符串,我得到有时段错误,有时总线错误10。在其他一些帖子上,我发现总线错误10有时会取代mac OS上的段错误(我第一次在上面编码,我习惯在linux上编码),我没有发现任何关于陷阱的信息。

无论如何,我认为它更多的代码问题,我的编译器和我想知道为什么我的代码功能在较小的字符串,而不是更大的,我读到,它可能是我如何影响值到我使用的字符串,但我不明白我在哪里犯了错误。

所以如果有人能给我一个线索,我做错了,我将非常感激:)

编辑

我遵循了评论中的建议,这是我修复后的函数,现在运行良好,谢谢。

(再一次,我知道我不需要tmp,还有许多其他更简单和更快的方法来完成它-这是作为训练(显然我需要^^))

char *my_strstr(char *s1, char *s2)
{
  int i, j;
  char *tmp;
  i = (j = 0);
  tmp = malloc(sizeof(strlen(s2)));
  if (s1 != '' && s2 != '')
    {
      while (s1[i] != '' && s2[j] != '')
        {
          if (s1[i] == s2[j])
            {
              tmp[j] = s1[i];
              j++;
            }
          else
            j = 0;
          i++;
        }
    }
  return (tmp);
}

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

在后面的代码中,你直接写
 tmp[j] = s1[i];

使用(解引用)tmp未初始化意味着您正在尝试访问无效的内存位置(还记得"不确定值"吗?),这可能无法从您的应用程序访问。它会调用未定义的行为。

解决方案:您需要在访问(解引用)tmp之前分配内存给它。


编辑:

然而,根据下面Vlad先生的评论,你的my_strstr()逻辑也有问题。一旦增加j(搜索字符串的索引)并发现两者之间的不匹配,就不能将其重新设置为0

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

字符串越长,占用的内存位置就越多。

你只是幸运地得到了一些较短字符串的结果。

相关内容

最新更新