Указание на структуры в связанном списке - PullRequest
0 голосов
/ 19 ноября 2010

Мы пытаемся установить адрес структуры на адрес, который нам дан, но когда мы распечатываем адрес структуры, он, кажется, не совпадает с адресом, который нам дан.

/*a struct to keep block information*/
struct header{
    int space;
    int free; /* 1 = free space and 0 = full*/
    struct header *nextHead;
    struct header *prevHead;
};

typedef struct header node;

int myinit(int *array, int size){

    int newSize = size;
    node * nullPointer;
    nullPointer = NULL; //make intermediatry node pointer for some bullshit reason

    * (array) = newSize;  /*store the size of the malloc at the first address*/

    printf("Address : %p\n", &array[0]);
    array++;
    printf("Address  after: %p\n", &array[0]);

    /*initial block*/
    node *root = (node *)&array; /*store the root at the next address available*/
    printf("size of struct %lu\n", sizeof(struct header));

    printf("%p\n", root);

    root->space = newSize;
    root->free = 1;
    root->nextHead = nullPointer;
    root->prevHead = nullPointer;


}

Ответы [ 3 ]

2 голосов
/ 19 ноября 2010

В строке

node *root = (node *)&array;

Вы берете адрес локальной переменной "array". IOW, вы берете адрес значения, который находится в стеке, а не то, что вы ожидаете. Вы должны изменить сигнатуру функции следующим образом:

int mymain(int **myarray, int size);

и соответственно измените его определение. Затем вы можете написать:

node *root = (node *)array;
1 голос
/ 19 ноября 2010
node *root = (node *)&array; 

Здесь вы получаете адрес указателя и приводите его к другому указателю.Вы не должны этого делать.Здесь вы должны выделить память для узла:

 node * root = (node *) malloc(sizeof(node));
// or  this allocates the memory and puts zeros to it     
node * root = (node *) calloc(1, sizeof(node)); 

Кроме того, вам не нужны узлы, указывающие на NULL, вы можете просто использовать NULL следующим образом:

node->nextHeader = NULL;
0 голосов
/ 19 ноября 2010

Кроме того, вместо &array[0] используйте array в этом фрагменте кода.
Вы будете меньше путаться с указателями, если будете придерживаться простого кода и понимать каждую написанную вами строку. Когда у вас в одной строке много амперсандов и специальных знаков, вы, вероятно, делаете что-то не так, тренируйте свое чувство паука для этих ситуаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...