首页 > 解决方案 > 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);

标签: csegmentation-faultmalloc

解决方案


当然可能还有其他问题,但是由于您只为n结构分配了空间,因此不能循环使用for (i = 0; i<=n; i++).

你需要比这少一个:

for (i = 0; i < n; i++)

尝试访问 fibo_table[n] 是未定义的行为。有效索引为 0 到 n - 1。


推荐阅读