c - 当我尝试读取动态分配的数组内容时,为什么我的 C 代码会出现 "segmentation fault"错误?

标签 c segmentation-fault

正如问题所解释的那样,我在我的 C 代码中创建了一个动态分配的结构数组(我称之为 struct Desk*)。在主函数中,我在它们的“int deskId”字段中提供了 int id 编号。当我尝试在主函数中读取它们的 id 时,代码按预期工作。另一方面,如果我尝试在 main 之外读取它们的 id 内容(如以下代码所示),则会出现段错误(核心转储)错误。我在下面给出有问题的代码。如您所见,我注意给出数组参数的地址(即指向实际数组的指针),以便我可以读取数组的实际内容,而不是本地副本。 提前致谢。

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"

struct Desk {
    int deskId;
    Queue deskQueue;
};

struct TaxPayer {
    int id;             // tax payer ID
    float duration;     // payment duration
};

//function to display the ids of the desks
int display (int desks, struct Desk** argsptr) {
    int i=0;
    while(i < desks) {
       printf ("My argument's id is %d\n",argsptr[i]->deskId );
       i++;
    }
    return 0;
}

int main (int argc, char *argv[]) {
  int option_index = 0;
    int p_num = 20;
    int desk_num = 4;
    int max_q_size = 3;


 //initialize array of desks
  struct Desk* desk_array = malloc(desk_num * sizeof(struct Desk));
  for (int i= 0; i < desk_num; i++) {
    queueInit(&desk_array[i].deskQueue, sizeof(struct TaxPayer));
    desk_array[i].deskId = i;
  }

  display(desk_num, &desk_array);
  free(desk_array);

  return 0;
}

最佳答案

您将 desk_array 指针的地址传递给 display() 而不是指针本身。 display() 然后是读取指针,然后是指针之后的内存区域等等。你要做的是传递指针desk_array,然后使用. 而不是函数内部的 -> 因为 [i] 取消引用 desk_array

int display (int desks, struct Desk* argsptr) {
    int i=0;
    while(i < desks) {
       printf ("My argument's id is %d\n",argsptr[i].deskId );
       i++;
    }
    return 0;
}

...

display(desk_num, desk_array);

关于c - 当我尝试读取动态分配的数组内容时,为什么我的 C 代码会出现 "segmentation fault"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55459294/

相关文章:

转换问题: __asm__ __volatile__ from GNU C to MSVC for in/out wrappers

c - 为什么使用 -lpthread 隐式声明 pthread_yield 而使用 -pthread 则一切正常?

python - 为什么这个函数在一些更大的变量值上得到错误的结果

c++ - 信号 : Segmentation fault (11) Signal code: Invalid permissions (2)

更改 argv 后的 C 段错误

php - Symfony Doctrine 数据加载段错误

c - 尝试使用指针将一个字符串复制到另一个字符串时检测到堆栈崩溃

c - 在 C 中,字符如何工作

c - mpz_add() 在大型程序中导致段错误

c++ - x 秒后终止正在运行的线程的最佳方法是什么?