带malloc/free的C代码中的SIGBART
我编写这个小程序是为了在更大的字符串中查找所有出现的子字符串,或者大海捞针。当我在本地运行该程序时,它似乎运行得很好。然而,当我把它提交给一个在线比赛进行评判时,它给出了一个SIGBART错误。我认为这是因为内存管理不善,所以我删除了带malloc/free的C代码中的SIGBART,c,memory-management,malloc,free,C,Memory Management,Malloc,Free,我编写这个小程序是为了在更大的字符串中查找所有出现的子字符串,或者大海捞针。当我在本地运行该程序时,它似乎运行得很好。然而,当我把它提交给一个在线比赛进行评判时,它给出了一个SIGBART错误。我认为这是因为内存管理不善,所以我删除了free()函数调用,但随后出现了一个超过时间限制的错误(但SIGBART错误消失)。删除free()调用是否会降低程序的速度?我的程序有漏洞吗 这里是我所说的比赛: 代码如下: #include <stdlib.h> #include <std
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
从问题中转录输入和输出规范 输入 输入由许多测试用例组成。每个测试用例由三行组成,包括:
- 针的长度
- 针本身
- 干草堆
我不确定这是否是问题的直接原因,但一个明显的问题是您没有使用
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
(并且可能会在算法过程中撞上干草堆)
您的算法是朴素的算法(通过专门扫描针的第一个字符而有所增强),这可能太慢了:
然而,一个简单的方法可能会超过时间限制,而其他算法则更复杂