我正在编写一些代码来与我创建的动态内存进行交互,我想知道为什么它不起作用。
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;
这是创建数组或 orderNode 并尝试访问它们的代码。打印语句给了我一个分段错误。不知道为什么。
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("%sn",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,您必须在尝试访问其自己的数据成员之前分配数据成员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 );
您从未分配过任何order
:
orderNode *processQueue = calloc(numcats, sizeof(orderNode)) ;
for (i=0;i<numcats;i++)
processQueue[i].order = calloc(1, sizeof(order));
此外,我在第一次分配中使用了 calloc 来确保所有next
指针都是 NULL。 不过,我不确定您打算用这些next
指针做什么。
编辑:另外,正如莫斯科的弗拉德指出的那样,processQueue属于错误的类型(我修复了上面的类型)。