C - 使用 malloc() 的分段错误(核心被愚弄)
C - Segmentation Fault (core dumbed) with malloc()
我有以下结构:
struct fibo_entry
{ /* Definition of each table entry */
int n;
unsigned long long int lli; /* 64-bit integer */
char *str;
};
我正在尝试打印由参数传递的 X+1 斐波那契数的数字和字符串(数字转换为字符串)。我正在尝试根据实际数字的小数位数动态创建 str
的 space。
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
结构分配了 space,因此您不能使用 for (i = 0; i<=n; i++)
.
循环
你需要比那个少一个:
for (i = 0; i < n; i++)
试图访问 fibo_table[n] 是未定义的行为。有效索引为 0 到 n - 1。
我有以下结构:
struct fibo_entry
{ /* Definition of each table entry */
int n;
unsigned long long int lli; /* 64-bit integer */
char *str;
};
我正在尝试打印由参数传递的 X+1 斐波那契数的数字和字符串(数字转换为字符串)。我正在尝试根据实际数字的小数位数动态创建 str
的 space。
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
结构分配了 space,因此您不能使用 for (i = 0; i<=n; i++)
.
你需要比那个少一个:
for (i = 0; i < n; i++)
试图访问 fibo_table[n] 是未定义的行为。有效索引为 0 到 n - 1。