2016-03-26 19 views
0

Bir işlev içinde struct player s değişken uzunlukta bir arabellek başlatmalıyım. Şimdiye kadar bu ile geldi budur:Bir işlev içinde yığında bir yapı oluşturma ve onu başka bir işlevde oluşturulmuş bir dizinin bir dizinin konumuna atama

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

struct player{ 
    char name; 
}; 

void players_init(struct player **players){ 
    *players = malloc(2 * sizeof(struct player)); 
    struct player p1, p2; 
    p1.name = 'X'; 
    p2.name = 'Y'; 

    (*players)[0] = p1; 
    (*players)[1] = p2; 
} 

int main(int argc, char *argv[]) 
{ 
    struct player *players = NULL; 
    players_init(&players); 
    printf("%c\n", players[0].name); // prints X 
    printf("%c\n", players[1].name); // prints Y 

    return 0; 
} 

Sorum edilir: Ben bir işlev içinde p1 ve p2 oluşturuyorsam beri, bu iki değişken aynı işleve adanmış yığın çerçeve üzerinde tahsis edilmelidir, Bu işlev sona erdiğinde, bu değişkenler gitmelidir.

Örneğimde gördüğünüz gibi, bu değişkenleri başka bir işlevde oluşturulan arabellek players arabelleklerine atayım.

Kodumun neden işe yaradığını merak ediyorum (gerçekten işe yarıyorsa), çünkü temelde, players_init sonlandırıldığında, benim anlayışımdan artık olmamak zorunda olan değişkenlere başvuruyorum.

Neyi eksik?

+0

Yap ' zaman, ve kullanmak için bir 'char' adı geçmek. O zaman şöyle adlandırın: 'players_init (& players, 'X'); players_init (& players, 'Y'); ' Bu, kodunuzun beklediğiniz gibi kırılmasını engelleyecektir, çünkü varolan kodunuzun düzgün çalışmasına izin vermek üzere takılan başlatılmamış belleğin üzerine yazılacaktır. – sehrgut

cevap

1

Tüm yapıyı diziye kopyaladığınız için çalışır. p1 ve p2 adreslerini kullanıyor olsaydınız, p1 derken ve p2'nin kapsam dışı kalması nedeniyle tanımlanamayacaksınız.

Vakanız önemsiz olmakla birlikte, gerçek dünyada sadece bir yapı kopyasını yaptığını unutmayın, bu nedenle kopyalandığı bit bilmek gerekir hangilerininse

bir az bir oyuncu init players_init`
+0

Tamam. Öyleyse, teorik olarak 'struct player' değişkeni 'p' üzerinde oluşturmam ve atamadan önce alanın adını değiştirmem gerekiyor, çünkü her durumda yapının bir kopyası oluşturuluyor ...? – nbro

+0

Evet. 'P1' ve p2' yi' p' ile değiştirebilir ve dizideki öğeleri aynı 'p' kullanarak birbiri ardına sıralayabilirsiniz. Demek istediğin bu muydu? – John3136

+0

Evet. Teşekkürler! Bununla ilgili sorunlardan bahseden iyi bir öğretici biliyor musunuz, yani tam olarak ne zaman dikkatli olmalıyız, vb. – nbro

İlgili konular