2010-11-19 37 views
0

Bir yapının adresini, verdiğimiz bir adrese ayarlamaya çalışıyoruz, ancak yapının adresini yazdırdığımızda, adresimizle aynı değere sahip görünmüyor. verilen. hatBağlantılı bir listedeki yapılara işaretleme

node *root = (node *)&array; 

Sen "dizi" Yerel değişkenin adresini alıyorsun yılında

/*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; 


} 
+0

Kod ilk iyi görünüyor Bakış, sorun nerede? – DarkDust

cevap

2

. IOW, beklediğiniz şeyin değil, yığında bulunan değerin adresini alırsınız. İşlev imzasını şu şekilde değiştirmelisiniz:

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

ve tanımını buna göre değiştirin. Yerine &array[0] kullanmak yerine, aynı zamanda

node *root = (node *)array; 
+1

İyi bir yanıt, ancak fonksiyon tanımının 'int **' yerine 'node **' kullanılması gerektiğini eklemeliyim. Ayrıca, birisinin neden bir listedeki bağlantılı liste düğümlerini ilk sırada saklayacağına ya da "newSize" in neden iki farklı yerde depolandığına dair hiçbir fikrim yok. Muhtemelen arayüz gereksinimleri burada tam olarak anlaşılmamıştır. –

0

bu kod parçasında array kullanın: Sonra yazabilirsiniz.
Basit bir kod kullanmaya devam ederseniz ve yazdığınız her satırı anlarsanız, işaretçilerle daha az karışırsınız. Bir satırda birçok ampersan ve özel işaretiniz olduğunda muhtemelen yanlış bir şey yapıyorsunuz, bu durumlara karşı örümcek hislerinizi eğitin.

1
node *root = (node *)&array; 

Burada, bir işaretçinin adresini alırsınız ve diğer işaretçiye yönlendirin. Bunu yapmamalısın. Burada düğüm için bellek ayrılamadı gerekir:

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

Ayrıca, sadece böyle NULL kullanabilirsiniz NULL işaret eden herhangi bir düğüm gerekmez:

node->nextHeader = NULL; 
+0

kodumda malloc'u yeniden yazıyorum, bu yüzden malloc'a herhangi bir örtülü çağrı kullanamıyorum, yapıyı oluşturmanın başka bir yolunu görebilir ve içindeki değerleri ayarlayabilir misiniz? Değerleri doğrudan NULL olarak ayarlayarak, derleyemedik, onu ayarlamak için bir ara değer oluşturmamız gerekiyordu. – Alex

+0

hangi derleme hatası alıyorsunuz? cevabı belleği ayıran başka bir yolla güncelledi –

İlgili konular