2016-03-27 27 views
-8

tamam NULL bir yapı ... ne oluyorBOŞ birdenbire içeren bir yapı işaretçisi geçme yerine daha küçük bir örneğini yeniden oluşturdum ve sorun devam

Yorumlar işaret içermektedir. İşaretçinin NULL olması beklenir ancak IM, ikinci bir kez başka bir işleve geçirdikten sonra NULL değerleri ile bir yapı elde edilir.

header.h

#include "Header.h" 
#include <stdio.h> 
#include <stdlib.h> 

void two(List *self) 
{ 
    //*self does not = NULL now 
    //*self = a struct with null data and next values 
} 

void one(List *self) 
{ 
    two(&self); 
    // *self = 0x0000... NULL 
} 

int main() 
{ 
    List test = NULL; 
    one(&test); 
} 
+0

Bu izin verilecek sanmıyorum '* Yapı tanımının ile ThePointer'. – ameyCU

+3

'Maalesef asıl kodu ödev olarak gösteremiyorum. ': Size bu şekilde yardımcı olamayız. Gerçek kodlara ihtiyacımız var. Ayrıca, bir projeden diğerine kod yapıştırılmış kodlar ve semantik/sonuçlar farklıysa, büyük olasılıkla projenin diğer kodundan kaynaklanan, aralarında gerçekten korkak bir şey oldu. – 3442

+1

Üzgünüm, kodunuzu keşfetmek ve sorununuzu çözmek için bilgisayarınızı kesmeye çalışmayın. Kodun lütfen. – jdarthenay

cevap

0

Sizin one() işlevi olmalıdır

typedef struct node { 
int data; 
struct node *next; 
} *List; 

source.c:

void one(List *self) 
{ 
    two(self); 
} 

argümanlar -Wall ile derlemek edin. Ayrıca, -Wextra ve -Werror kullanılması önerilir.

0
List test = NULL; 
one(&test); 

teststruct node bir işaretçidir. one numaralıişaretçisinin adresini, one'un test değiştirmesine izin veririz ( yeni işaretçiyi döndürmek, bunu yapmak için daha temiz bir yoldur).

one bu yürütür:

two(&self); 

two hemen test adresinin adresini geçirilen. Bu, muhtemelen ne amaçladığınız . Eğer yapmak istediğin buysa sen test değiştirmek test adresini Geçme hala olanak tanır:

two(self); 
+0

Thanx çok m8. Benzer örneklerde zaten neyin var olduğunu değiştirmek için fonksiyonlar için adresi geçiyordu. Ama şimdi bu atama, 2 fonksiyondan geçmek için modifikasyonlar gerektiriyor. bilerek yapmış bu sorunu görünmesi için. Ben senin sağ olsa. bir işaretçi dönen fonksiyonlar dahilinde farklı derin onları tedavi çok daha iyi olacağını düşünüyorum.Ben zaten bu sonuca varmaktaydım, ama sadece kolay bir şekilde yapıp yapmadığımdan emin değildim çünkü sadece yanlış yapıyordum. – Brad