c - 分段错误 - 分而治之
问题描述
我正在尝试编写一个使用分治法显示最长公共前缀的程序。我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char *lcpUtil(char str1[], char str2[])
{
char *result = NULL;
result = (char *)malloc(sizeof(char) * 100);
int n1 = strlen(str1), n2 = strlen(str2);
for(int i = 0, j = 0; i <= n1-1 && j <= n2-1; i++, j++)
{
if(str1[i] != str2[j])
break;
strncat(result, &str1[i], 1); // append the prefix to the result string
}
return (result);
}
const char *lcp(char **str, int l, int r)
{
char str1[100], str2[100];
if(l == r)
{
return (str[l]);
}
if (l < r)
{
int m = (l + r)/2;
strcpy(str1, lcp(str, l, r));
strcpy(str2, lcp(str, m+1, r));
}
return (lcpUtil(str1, str2));
}
int main(int argc, char **argv)
{
char *arr[4] = {"apple", "application", "april", "apartment"}; // ap
int n = 4;
char prefix[100];
strcpy(prefix, lcp(arr, 0 , n-1));
if(strlen(prefix))
{
printf("The longest common prefix: %s\n", prefix);
}
else
printf("There is no common prefix");
return 0;
}
如果我运行它,则会出现分段错误,使用 gdb 进行调试会说:
Program received signal SIGSEGV, Segmentation fault.
0x00005555555552b7 in lcp (str=<error reading variable: Cannot access memory at address 0x7fffff7fefa8>, l=<error reading variable: Cannot access memory at address 0x7fffff7fefa4>,
r=<error reading variable: Cannot access memory at address 0x7fffff7fefa0>) at lab11.c:23
#1 0x0000555555555325 in lcp (str=0x7fffffffde40, l=0, r=3) at lab11.c:30
我知道我没有释放用 malloc 分配的内存,但它应该仍然可以工作。我不确定为什么会这样。有任何想法吗?
解决方案
因为函数lcp(str, l, r)
调用lcp(str, l, r)
. _
此外,未定义的行为也可以通过使用malloc()
分配给result
in的未初始化缓冲区的内容来strncmp()
调用 from lcpUtil
。
推荐阅读
- augmented-reality - A-FRAME:如何显示 SVG 动画
- c# - 实体框架 DbContext 过滤的计数查询使用变量非常慢
- python-3.x - 射线标准输出到哪里去了?
- android - 协程、异步 DiffUtil 和不一致检测错误
- java - 为什么 inc/dec 通道不做任何事情?
- mysql - MySQL - 想要增量删除任何早于 x 行的内容
- import - ImportError:木星实验室和 VSCode 上没有名为 pytesseract 的模块,但不是我的本地模块
- android - 是否可以从两个不同类型的列表中显示 Recyclerview?
- javascript - 在 Javascript 函数中接收 JSON 结构化参数
- docker - Dockerfile 中的 ADD 关键字有什么用?