c - 在具有二维数组的程序中调试 SIGABRT 错误
问题描述
我正在尝试调试一个文本编辑器程序,在该程序中,我创建一个二维数组,每次从文件中有新输入时,它的大小都会加倍。Valgrind 返回:
==1454== Process terminating with default action of signal 6 (SIGABRT)
==1454== at 0x48A518B: raise (raise.c:51)
==1454== by 0x4884858: abort (abort.c:79)
==1454== by 0x48EF3ED: __libc_message (libc_fatal.c:155)
==1454== by 0x49919B9: __fortify_fail (fortify_fail.c:26)
==1454== by 0x4991985: __stack_chk_fail (stack_chk_fail.c:24)
==1454== by 0x10980C: main (in /home/utente/Desktop/main)
这是我的主要内容,我称之为重新分配数组的乐趣
int main() {
FILE *fp;
cmd istruction;
char **Array = {0};
fp=fopen("prova.txt", "rt");
int dim=30;
Array = Create2D(H);
istruction=GetOrder(fp);
while (dim<variable) {
Array = Reallocation2D(Array,dim);
dim=dim*2;
}
doing stuff...
}
}
free2D(Array, dim);
fclose(fp);
}
create 数组和 reallocation2D 是
char ** Create2D(ssize_t Strings)
{
char **a = {0};
a = calloc(Strings, sizeof(char *));
return a;
}
char ** Reallocation2D(char ** a, size_t dim){
int i;
char **b = {0};
b = calloc(dim*2, sizeof(char *));
for(i=0;i<dim*2; i++)
{
b[i] = calloc(1024, 1);
}
for(i=0;i<dim;i++){
if(a[i]) strcpy(b[i],a[i]);
}
for(i=0;i<dim; i++)
{
if(a[i]) free(a[i]);
}
free(a);
return b;
}
解决方案
没有代码,只能尝试分析 valgrind 的输出:
问题似乎发生在main()
您有堆栈溢出的函数中。您是否调用定义非常大的自动数组的函数?或者你自己定义这样一个数组main()
?
从发布的代码来看,这里有一些问题:
初始调用为指针
Create2D
分配空间,但您初始化为. 没有定义,它是一个for吗?H
dim
30
H
#define
30
在哪里
variable
设置?为什么要重新分配
char
数组而不是复制它们?您分配
1024
字节大小的行。这可能比磁盘上的文件使用更多的代码内存,如果文件 os 中的行长于此,仍然不够用。为什么不使用
realloc()
inReallocation2D
并将新分配的部分初始化为NULL
指针?您应该测试分配失败并报告它。
推荐阅读
- batch-file - 无法在批处理脚本中正确设置变量
- c++ - C++ 中的树实现:无法将节点转换为 int* 问问题
- java - 显示文本中最常用的词
- typescript - 如何在环回 4 中创建客户错误处理程序
- php - 如何在 PHP 中递归调用 __get()?
- amazon-web-services - 如何强制删除网络接口?AWS - 分离网络接口时出错
- r - R 将时间 (xx:xx:xx) 转换为最小值。as.POSIXct 返回错误“字符串不是标准的明确格式”
- font-awesome - Font Awesome 5 “fa-layers-text”类是否有不可破坏的空间?
- c - 将一组 Array 传递给新函数进行计算
- xamarin.android - 无法编译Xamarin项目,编译时出现四个错误