我有以下结构:
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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句