【问题标题】:Segmentation fault while trying to use malloc尝试使用 malloc 时出现分段错误
【发布时间】:2018-09-24 15:00:07
【问题描述】:

所以,我有这个结构。

typedef struct queue {
    int size; //size of the array
    int inicio; //first position that contains a value in the array
    int tamanho; //number of actual values in the array
    int *valores; //array
  } QUEUE;

我有这个函数与这个结构一起工作

int enqueue (QUEUE *q, int x){
  if(q -> inicio + q -> tamanho < q -> size){
    q -> valores[q -> inicio + q -> tamanho] = x;
    q -> tamanho++;
  }

  else if (q -> tamanho < q -> size){
    for(int i = 0; i < q -> tamanho; i++){
      q -> valores[i] = q -> valores[q -> inicio + i];
    }
    q -> inicio = 0;
    q -> valores[q -> tamanho++] = x;
  }

  else{
    int *new = malloc(q -> size * 2 * sizeof(int));

    for(int i = 0; i < q -> size; i++){
      new[i] = q -> valores[i];
    }

    new[q -> size] = x;
    q -> size *= 2;
    free(q -> valores);
    q -> valores = new;
  }

  return 0;
}

当您获取列表的元素时,您从开头获取它们,因此开头中没有“任何东西”。

所以这个函数应该在有空格的情况下将值添加到末尾,将所有内容推送到开头,如果开头有空格而最后没有空格,则将其添加到末尾,并扩展如果需要更多空间,请使用数组。事情是......它立即给出了一个分段错误。如果我试图在 else 的开头打印一些东西,它就不会这样做。

我真的迷路了。

【问题讨论】:

  • 在q -&gt; valores[q -&gt; inicio + q -&gt; tamanho] = x; valores 是结构的指针成员,你是否为q-&gt;valores 分配了内存?我不这么认为。
  • 问题不存在。那一点有效。 q 是一个参数,它已经初始化。问题出在第三个其他地方。前两个工作
  • 向我们展示您如何使用参数调用enqueue()
  • 旁注:虽然 C 中没有普遍接受的命名标准,但全大写的名称应该是宏。不要将它们用于类型、变量等。
  • 队列q1; q1.size = 3; q1.inicio = 0; q1.tamanho = 0;入队(&q1, 1);入队(&q1, 2);入队(&q1, 3);入队(&q1, 4);它一直有效到最后一个

标签: c arrays dynamic struct malloc


【解决方案1】:

在enqueue() 函数中为q -&gt; valores 分配内存。分配它。

int enqueue (QUEUE *q, int x){
     q -> valores = malloc(sizeof(QUEUE));/*check yourself how much memory you need */

    /* remaining same code */
}

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2021-03-18
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多