访问结构指针中的动态内存

时间:2014-11-25 20:12:15

标签: 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 orderNode *next;
};
typedef struct orderNode orderNode;

这是创建数组或orderNodes并尝试访问它们的代码。 print语句给我一个分段错误。不知道为什么。

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
    */

提前致谢!

2 个答案:

答案 0 :(得分:4)

我认为不是

orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;
你的意思是

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

还要考虑到对于数组中的每个orderNode,您必须在尝试访问其自己的数据成员之前分配数据成员order

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 );

答案 1 :(得分:2)

您从未分配任何order

orderNode *processQueue = calloc(numcats, sizeof(orderNode)) ;

for (i=0;i<numcats;i++)
    processQueue[i].order = calloc(1, sizeof(order));

另外,我使用calloc进行第一次分配,以确保所有next指针都为NULL。我不确定你打算用next指针做什么。

编辑:同样,正如莫斯科的Vlad指出的那样,processQueue的类型错误(我修改了上面的类型)。