2014-11-12 15 views
5

Dinamik olarak ayrılan bir dizi yapıya sahibim. Bu diziye bir işaretçi, diğer işlevlere geçirilir.Bir dizinin -1 elemanına erişim c

struct body{ 
    char* name; 
    double mass; 
    // ... some more stuff 
    }; 

body *bodies = malloc(Number_of_bodies*sizeof(body)); 

bir dizi boyutunu bilmek gerekir, bu yüzden dizi (ilk yapı) 0'ıncı elemanının içinde yapılar birinde boyutunu depolamak ediyorum.

bodies[0].mass = (double)Number_of_bodies; 

Sonra diğer fonksiyonlarda bu işaretçi kullandığınızda Şimdi, veri 0 elemanın başlamalıdır bodies[1]

return (bodies+1); 

yani dizinin 1 elemana işlevinden bir işaretçi döndürür .

body *new_bodies = (bodies+1);  //Just trying to show what happens effectively when i pass to another function 
    new_bodies[0] = *(bodies+1);  //I Think 

Ben bodies[0] idi ilk yapı, görmek istiyorsanız

, ben new_bodies[-1] erişmek zorunda diğer işlevlerde anlama geliyor?

Bu yapabileceğim bir şey mi? İlk yapıya nasıl erişebilirim?

+1

Evet. Emin. Neden olmasın? 'a [b]' * (a + b) 'olarak tanımlanır. – Deduplicator

+1

C [Negative array indexes in C?] Ile ilişkili (http://stackoverflow.com/q/3473675/1708801) –

cevap

11

Evet, dizinin başlangıç ​​öğesine erişmek için new_bodies[-1] kullanabilirsiniz. Bu tamamen yasal. köşeli parantez + yazma başka bir yoludur, böylece new_bodies[-1] yazarken o *(new_bodies-1) aynıdır:

arkasındaki neden işaretçi aritmetiği olduğunu. new_bodies yana

bodies[0] özdeş new_bodies[-1] yapım new_bodies-1(bodies+1)-1 veya bodies olup, bodies+1 olarak elde edilmiştir.

Not: Eğer struct s dizinin ilk elemanının içine öğe sayısını ayakkabı çekeceği çalıştığınız gibi görünüyor, başka bir amaçla kullanmak bunun için mass alan. Bu işe yarayacaktır, ancak hem bellek ayırma açısından (bir işaretçi name hala kullanılmamaktadır), fakat en önemlisi okunabilirlik açısından yetersizdir. Açıkça girişlerinin sayısını saklayan bir struct esnek dizi elemanını kullanarak kapalı çok daha iyi olurdu:

İşte
struct body { 
    char* name; 
    double mass; 
    // ... some more stuff 
}; 
struct bodies { 
    size_t count; 
    body bodies[]; // <<== Flexible array member 
}; 
... 
bodies *bb = malloc(sizeof(bodies)+Number_of_bodies*sizeof(body)); 
bb->count = Number_of_bodies; 

another Q&A with an example of working with flexible array members bağlantısıdır.

+0

Tam olarak ne yapmaya çalışıyordum! Bu harika bir çözüm. Çok teşekkürler! – Rohan