所以我得到了struct Node
,其中包含2个字段:
DataP data
,void * key
,DataP
只是typedef
的{{1}}。
我创建了一个双指针void*
,使其像2D数组一样。
我无法想出如何对它进行malloc,我希望这个双指针充当一个2D数组,其中行数为2,列数为x。
我试过Node **table
但这是对的吗?以及如何从这里继续?
答案 0 :(得分:2)
我试过
table = (Node**)malloc(sizeof(Node*)*2);
,但这是正确的吗?
是你正在以正确的方式做到这一点。现在您有两个Node*
类型table[0]
和table[1]
请注意,您无需转换malloc()
的返回值。原因如下: click
如何从这里继续?
现在使用for
循环为上述两个变量分配内存
for(int index = 0; index < num_of_rows; index++)
{
table[index] = malloc(no_of_columns * sizeof(Node));
//don't cast the return value of malloc()
}
所以下次你想为双指针分配内存时,你可以这样做:
table = malloc(no_of_rows * sizeof(Node));
for(int index = 0; index < num_of_rows; index++)
{
table[index] = malloc(no_of_columns * sizeof(Node));
}
//Don't forget to free() the pointers you malloced when you no longer need them
for(int index = 0; index < num_of_rows; index++)
{
free(table[index]);
}
free(table);
答案 1 :(得分:1)
大小为ROW_NUM x COL_NUM的表的分配内存顺序应如下:
1)指针数组的内存:
Node ** table = malloc( sizeof(Node*) * ROW_NUM);
2)每行的内存(需要循环)
for(int i = 0; i < ROW_NUM; i++)
table[i] = malloc( sizeof(Node) * COL_NUM);
解除分配顺序必须颠倒:首先free
为每个table[i]
循环
答案 2 :(得分:0)
您需要先分配表,然后分配每一行:
table = malloc(sizeof(Node*)*2);
for (int i=0; i<2; i++)
table[i] = malloc(sizeof(Node)*x);
当你完成使用它时,不要忘记释放这段记忆:
for (int i=0; i<2; i++)
free(table[i]);
free(table);
答案 3 :(得分:0)
总结和调整,它应该如下所示:
Node.h
#include <stdlib.h> /* for EXIT_xxx macros */
#include <stdio.h> /* for perror() */
#include "node.h"
#define ROWS (5)
#define COLUMNS (7)
int main(void)
{
struct Node ** ppNode;
if (-1 == nodes_allocate(&ppNodes, ROWS, COLUMNS);
{
perror("nodes_allocate() failed");
return EXIT_FAILURE;
}
/* Do stuff. */
/* clean up. */
nodes_free(*ppNodes, ROWS);
return EXIT_SUCCESS;
}
Node.c
;With cte
as
(select
itemnumber,saledate,dense_rank() over (partition by itemnumber order by cast(month(saledate) as varchar(2))+'/'+cast(year(saledate) as varchar(4)) ) as rownum
from
@sales
)
select itemnumber,cast(month(saledate) as varchar(2))+'/'+cast(year(saledate) as varchar(4)),sum(rownum) as salescount
from cte
where rownum=1
group by
itemnumber,cast(month(saledate) as varchar(2))+'/'+cast(year(saledate) as varchar(4))
使用以下功能:
{{1}}