Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在结构指针中访问动态内存_C_Arrays_Dynamic_Struct_Malloc - Fatal编程技术网

C 在结构指针中访问动态内存

C 在结构指针中访问动态内存,c,arrays,dynamic,struct,malloc,C,Arrays,Dynamic,Struct,Malloc,我正在写一些代码来与我正在创建的动态内存交互,我想知道它为什么不工作 struct order{ char *bookTitle; double price; char *category; double remain; int custID; char processed; }; typedef struct order order; struct orderNode{ order *order; struct orderNod

我正在写一些代码来与我正在创建的动态内存交互,我想知道它为什么不工作

struct order{
    char *bookTitle;
    double price;
    char *category;
    double remain;
    int custID;
    char processed;
};
typedef struct order order;

struct orderNode{
    order *order;
    struct orderNode *next;
};
typedef struct orderNode orderNode;
下面是创建数组或orderNodes并尝试访问它们的代码。打印语句给了我一个分段错误。不知道为什么

orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;
    //sort the orders into their respective categories
    //sortOrders(processQueue, unSortedQueue, numcats);
    processQueue[1]->order->category = "herro" ;
    puts("string set. \n");
    printf("%s\n",processQueue[1]->order->category);
    /* 
    gdb backtrace output.
    #0  strlen () at ../sysdeps/x86_64/strlen.S:106
    #1  0x00007ffff786794c in _IO_puts (str=0x1000000000a2074 <error: Cannot access memory at address 0x1000000000a2074>)
    at ioputs.c:36
    #2  0x000000000040192f in main (argc=4, argv=0x7fffffffdbd8) at main.c:444
    */

提前谢谢

我认为那不是

orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;
你是说

orderNode *processQueue = malloc(sizeof(orderNode)*numcats) ;
还要考虑到,对于阵列中的每个orderNode,您必须在尝试访问其自己的数据成员之前分配数据成员顺序

C中的指数从零开始。在这个声明中,

processQueue[1]->order->category = "herro" ;
您想访问processQueue[0]而不是processQueue[1]

代码可能看起来像

orderNode *processQueue = malloc( sizeof( orderNode ) * numcats );

processQueue[0].order = malloc( sizeof( order ) );
processQueue[0].order->category = "herro";

puts( "string set." );
puts( processQueue[0].order->category );

我想那不是

orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;
你是说

orderNode *processQueue = malloc(sizeof(orderNode)*numcats) ;
还要考虑到,对于阵列中的每个orderNode,您必须在尝试访问其自己的数据成员之前分配数据成员顺序

C中的指数从零开始。在这个声明中,

processQueue[1]->order->category = "herro" ;
您想访问processQueue[0]而不是processQueue[1]

代码可能看起来像

orderNode *processQueue = malloc( sizeof( orderNode ) * numcats );

processQueue[0].order = malloc( sizeof( order ) );
processQueue[0].order->category = "herro";

puts( "string set." );
puts( processQueue[0].order->category );

您从未分配任何订单:

此外,我在第一次分配中使用了calloc,以确保所有下一个指针都为空。不过,我不确定你打算用下一个指针做什么


编辑:另外,正如莫斯科的弗拉德指出的,processQueue的类型是错误的,我修复了上面的类型。

您从未分配过任何订单:

此外,我在第一次分配中使用了calloc,以确保所有下一个指针都为空。不过,我不确定你打算用下一个指针做什么


编辑:另外,正如莫斯科的Vlad所指出的,processQueue的类型是错误的,我修复了上面的类型。

必须为每个指针定义内存,这是将结构定义合并为单个定义的一个很好的理由,因此问题是第二个结构中的指针“顺序”没有特别指向任何地方,因此,从指针访问偏移量是未定义的行为,可能/将导致seg故障事件。必须为每个指针定义内存这是将结构定义合并为单个定义的一个很好的理由,因此问题在于第二个结构中的指针“顺序”没有特别指向任何地方,因此,访问指针的偏移量是未定义的行为,可能/将导致seg故障事件。