是否可以使struct-array的地址等于指向malloc内存的指针?

时间:2016-10-27 17:12:57

标签: c arrays pointers struct trie

在我创建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...

我不明白的是,指针和数组[]是否都是内存中的地址,为什么它们不能等同?

1 个答案:

答案 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);
}