Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
带malloc/free的C代码中的SIGBART_C_Memory Management_Malloc_Free - Fatal编程技术网

带malloc/free的C代码中的SIGBART

带malloc/free的C代码中的SIGBART,c,memory-management,malloc,free,C,Memory Management,Malloc,Free,我编写这个小程序是为了在更大的字符串中查找所有出现的子字符串,或者大海捞针。当我在本地运行该程序时,它似乎运行得很好。然而,当我把它提交给一个在线比赛进行评判时,它给出了一个SIGBART错误。我认为这是因为内存管理不善,所以我删除了free()函数调用,但随后出现了一个超过时间限制的错误(但SIGBART错误消失)。删除free()调用是否会降低程序的速度?我的程序有漏洞吗 这里是我所说的比赛: 代码如下: #include <stdlib.h> #include <std

我编写这个小程序是为了在更大的字符串中查找所有出现的子字符串,或者大海捞针。当我在本地运行该程序时,它似乎运行得很好。然而,当我把它提交给一个在线比赛进行评判时,它给出了一个SIGBART错误。我认为这是因为内存管理不善,所以我删除了
free()
函数调用,但随后出现了一个超过时间限制的错误(但SIGBART错误消失)。删除
free()
调用是否会降低程序的速度?我的程序有漏洞吗

这里是我所说的比赛:

代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define RAW_INPUT_SIZE 10000

#define BOOL unsigned int
#define NO 0
#define YES 1

int main (int argc, char **argv)
{
   int needleLength;
   char *rawNeedle = (char *)malloc(RAW_INPUT_SIZE);
   char *rawHaystack = (char *)malloc(RAW_INPUT_SIZE);
   char *needle; // to be allocated later
   char *haystack; // to be allocated later, but not deallocated
   while (scanf("%i\n%s\n%s", &needleLength, rawNeedle, rawHaystack) != EOF)
   {
      needle = (char *)malloc(needleLength);
      strncpy(needle, rawNeedle, needleLength);
      haystack = strchr(rawHaystack, needle[0]);
      int i = haystack - rawHaystack;
      BOOL matchesFound = NO;
      if (i + needleLength - 1 < strlen(rawHaystack))
      {
         while (haystack != NULL)
         {
            if (i + needleLength - 1 < strlen(rawHaystack))
            {
               char *substr = (char *)malloc(needleLength);
               strncpy(substr, haystack, needleLength);
               if (strcmp(needle, substr) == 0)
               {
                  printf("%i\n", i);
                  matchesFound = YES;
               }
               free(substr);
               substr = NULL;
            }
            haystack = strchr(haystack+1, needle[0]);
            i = haystack - rawHaystack;
         }
      }
      if (matchesFound == NO)
         printf("\n");
      free(needle);
      needle = NULL;
   }
   free(rawNeedle);
   free(rawHaystack);
   rawNeedle = NULL;
   rawHaystack = NULL;
   return 0;
}
#包括
#包括
#包括
#定义原始输入大小10000
#定义布尔无符号整数
#定义0
#定义是1
int main(int argc,字符**argv)
{
针尖长度;
字符*原始指针=(字符*)malloc(原始输入大小);
char*rawHaystack=(char*)malloc(原始输入大小);
char*needle;//稍后分配
char*haystack;//稍后分配,但不解除分配
while(scanf(“%i\n%s\n%s”,&needlegth,rawneele,rawHaystack)!=EOF)
{
针=(字符*)malloc(针长度);
strncpy(针、针、针长度);
干草堆=strchr(干草堆,针[0]);
int i=干草堆-干草堆;
BOOL matchesFound=否;
if(i+针长-1

从问题中转录输入和输出规范

输入 输入由许多测试用例组成。每个测试用例由三行组成,包括:

  • 针的长度
  • 针本身
  • 干草堆
针的长度仅受程序可用内存的限制,因此不要做任何假设,而是根据需要读取长度并分配内存。草堆的大小不受限制,这意味着您的程序不应该一次读取整个草堆。KMP算法是基于流的,即它逐字符处理haystack,因此这不是问题

测试用例一个接一个地出现,每个用例占用三行,中间没有额外的空间或换行符

输出 对于每个测试用例,您的程序都应该输出大海捞针出现的所有位置。如果找到匹配项,则输出应包含匹配项的第一个字符的位置。草堆中的字符以零开始编号

对于给定的测试用例,输出的位置应该按升序排序,并且每个位置都应该打印在单独的行中。对于两个不同的测试用例,应使用空行分隔位置


我不确定这是否是问题的直接原因,但一个明显的问题是您没有使用
strncpy
正确<代码>strncpy
不一定是NUL终止


此外,您不会检查malloc是否成功,也不会检查strchr是否成功。

为什么要使用任何内存分配?如果规格包括最大针长10000,只需使用本地阵列:

char needle[RAW_INPUT_SIZE];
char haystack[RAW_INPUT_SIZE];
直接阅读这些内容;不要到处抄袭

char *substr = (char *)malloc(needleLength);
strncpy(substr, haystack, needleLength);
if (strcmp(needle, substr) == 0)
不清楚您的针长度是否包括尾随空值。因此,这既不能分配足够的空间,也不能保证空终止,这两者都很容易导致SIGABRT问题

在干草堆上反复使用
strlen()
,会使程序运行缓慢。您可以计算长度,而无需在每个针和草堆上重复执行
strlen()

除非保证数据中没有空格,否则
scanf()
代码的读取量将低于预期。你应该经常检查你是否得到了你期望的所有值


您应该查找函数strstr()

您可能正在覆盖关键内存

针的长度仅受程序可用内存的限制,因此不要做任何假设,而是根据需要读取长度并分配内存。草堆的大小不受限制,这意味着您的程序不应该一次读取整个草堆。KMP算法是基于流的,即它逐字符处理haystack,因此这不是问题

您可以指望某些输入长度超过10000
char
s。这意味着您正在使用未分配的内存,其后果不可预测

更可预测的是,正如Jonathan Leffler所提到的,您的
substr
通常不会以0结尾,因此
strcmp
只能在
substr
后面紧跟“\0”字符时返回0,因此您可能会错过
haystack
(并且可能会在算法过程中撞上干草堆)

您的算法是朴素的算法(通过专门扫描
针的第一个字符而有所增强),这可能太慢了:

然而,一个简单的方法可能会超过时间限制,而其他算法则更复杂