c - C - 使用 malloc() 的分段错误(核心愚蠢)
问题描述
我有以下结构:
struct fibo_entry
{ /* Definition of each table entry */
int n;
unsigned long long int lli; /* 64-bit integer */
char *str;
};
我正在尝试打印由参数传递的 X+1 个斐波那契数的数字和字符串(数字转换为字符串)。我正在尝试str
根据实际数字的小数位数动态创建空间。
int main (int argc, char *argv[])
{
int n;
int i;
struct fibo_entry *fibo_table;
if (argc != 2)
panic ("wrong parameters");
n = atoi (argv[1]);
if (n < 2)
panic ("n too small");
if (n > LIMIT)
panic ("n too big");
//Struct
fibo_table = (struct fibo_entry*) malloc(sizeof(struct fibo_entry)*(n));
//Fibonacci
int var1 = 0;
int var2 = 1;
int aux = 0;
for (i = 0; i<=n; i++)
{
fibo_table[i].lli = var1;
if (var1 == 0){
aux = 1;
} else {
aux = floor( log10( abs(var1)) + 1);
}
//When i use print no garbage chars...
//printf("%d--> aux: %d var1: %d \n",i,aux,var1);
//Generates the space of decimal we actually have on var1
fibo_table[i].str = (char*)malloc(aux*sizeof(char));
//Converts the number into string
sprintf(fibo_table[i].str, "%llu", fibo_table[i].lli);
aux = var1 + var2;
var1 = var2;
var2 = aux;
fibo_table[i].n = i;
}
for (i = 0; i <= n; i++)
{
printf ("%d %llu %s\n", fibo_table[i].n, fibo_table[i].lli,
fibo_table[i].str);
}
free_memory(fibo_table, n);
return 0;
}
在这里,我试图解放记忆。
void free_memory(struct fibo_entry *table, int size)
{
int i;
for (i = 0; i<size;i++){
free(table[i].str);
}
free(table);
}
输出:
0 0 ��X�U
1 1 1
2 1 1
3 2 2
4 3 3
5 5 5
6 8 8
7 13 13
8 21 21
9 34 34
10 55 55
11 89 89
12 144 144
13 233 233
14 377 377
15 610 610
16 987 987
17 1597 1597
18 2584 2584
19 4181 4181
20 6765 6765
Segmentation fault (core dumbed)
我遇到的问题是我在 上得到垃圾字符str = 0
,我不明白为什么,当我这样
做时,printf("%d--> aux: %d var1: %d \n",i,aux,var1);
我没有得到垃圾字符。这是为什么?另外,由于free()
. 我做了一些研究,但没有发现任何东西,我已经尝试了不同的方法来释放内存:
free((*table)->str);
free(table[i]->str);
free(*(table+1)->str);
free(table[i].str);
解决方案
当然可能还有其他问题,但是由于您只为n
结构分配了空间,因此不能循环使用for (i = 0; i<=n; i++)
.
你需要比这少一个:
for (i = 0; i < n; i++)
尝试访问 fibo_table[n] 是未定义的行为。有效索引为 0 到 n - 1。
推荐阅读
- java - 使用比较器对 java 对象进行排序时出错:抽象且不覆盖抽象方法比较
- shopware - Shopware6 首次运行向导 - 如何在本地验证域
- python-3.x - tkinter 未显示在画布上创建的初始表
- angular - 更改 ViewChild 实现以支持多个通用组件
- ansible - 如何防止“dict object”没有任务选项的属性
- vue.js - 如何在 NuxtJS 中刷新链接访问的整个页面?
- javascript - 动态表单中自定义表单组件上的 ControlValueAccessor
- python - 将 Python 模块从 Collab 安装到 Jupyter
- python - 如何加速将张量转换为 tensorflow_datasets 中的 numpy 数组的代码?
- c++ - 链接器如何处理 C++ 标头中的定义?