在我创建trie的初始方法中,我尝试在malloc内存中放置一个结构数组,而不是使用指向左/右的指针。这可能吗?原则上可以struct array [] = struct * head?
好的,这是我正在使用的代码:
typedef struct node
{
char letter;
struct node* child;
}
node;
int main(void)
{
node* head = malloc(26*sizeof(node));
if (head == NULL)
return 1;
node* temp = head;
node array[26];
array = temp;
//proceed to fill array...
我不明白的是,指针和数组[]是否都是内存中的地址,为什么它们不能等同?
答案 0 :(得分:0)
如你所知,指针并不是一种数据类型,意味着这个容量(或使用的字节数),而只是一个内存方向引用:一个数字(表示为XXXXX:XXXXX主要情况和主SO为4字节数),表示存储页面&该页面内的偏移量。可以分配或不分配该方向引用的内存。就是这样,标记为SO,保留用于您的程序。但无论如何它只受该变量的保护:您的程序可以使用该内存块,例如,将其分配给任何类型的变量。如果为结构分配了正确大小的内存,然后引用该内存地址,则可以使用它而没有区别,就像您已被声明为正常变量一样。
在这个例子中,你可以使用没有任何差异线ST S [3]或ST * S = malloc(sizeof(ST)* 3);如图所示,sizeof(ST)将为您提供4(int)+ 1(char B)+ 20 * 1(char [20])= 25个字节,以及padding,28. malloc(sizeof(ST) )* 3)然后将为您的程序保留84个字节(当然更多,肯定是保留整个页面块的128个字节)并将为您提供保留的第一个字节的内存方向。事实上,这个malloc与声明ST S [3]大致相同;
由于大量的可能指针允许,因为直接访问内存(例如,大量变量共享相同的内存,或者容量沿着内存块上升和下降),因此很难管理,所以,一大堆bug,更喜欢更高级的抽象。但你的问题的答案是肯定的,这是可能的。
#include <malloc.h>
typedef struct ST
{
int A;
char B;
char C[20];
} ST;
int main(int agrc, char *agrv[])
{
// ST S[3];
ST *S = malloc(sizeof(ST)*3);
// ST *S = malloc(100);
S[0].A = 1; S[0].B = '1'; S[0].C[0] = 'a';
S[0].C[1] = 'b'; S[0].C[2] = 'c'; S[0].C[3] = '\0';
S[1].A = 2; S[1].B = '2'; S[1].C[0] = 'A';
S[1].C[1] = 'B'; S[1].C[2] = 'C'; S[1].C[3] = '\0';
S[2].A = 3; S[2].B = '3'; S[2].C[0] = 'Z';
S[2].C[1] = 'z'; S[2].C[2] = 'Z'; S[2].C[3] = '\0';
int i=0;
for (i=0;i<3;i++)
{
printf("Struct %d\n",i);
printf("%d\n",S[i].A);
printf("%c\n",S[i].B);
printf("%s\n",&S[i].C);
printf("\n");
}
}
ADDED:这是相同的,但是从另一个方面来说:在内存中转到字符串的方向,并将其解释为我们的结构。
#include <malloc.h>
typedef struct ST
{
short A; // 2
char B; // 1
char C[20]; // 20
} ST;
int main(int agrc, char *agrv[])
{
char *s =malloc(28);
s[0] = 65; // Lower byte of int
s[1] = 65; // Higher byte of int
s[2] = 'C';
s[3] = 'a';
s[4] = 'b';
s[5] = 'c';
s[6] = 0x00;
printf("%s\n",s);
ST *T;
T = (void *)s;
printf("%d\n",T[0].A);
printf("%c\n",T[0].B);
printf("%s\n",T[0].C);
}