2009-05-26 18 views

cevap

6

Klasik sorun. Sadece bununla başa (ve birden fazla kapalı olabilir) o sizeof (foo not derleyici olan yapı boyutu yukarı, (inanıyorum) izin yuvarlar ise) veya böyle bir şey yapabilirsiniz edebilirsiniz:

struct packetheader { 
    int id; 
    int filename_len; 
}; 
struct packet { 
    struct packetheader h; 
    char filename[1]; 
}; 

Bu sinir bozucu (eğer h.id, vb kullanmak zorunda), ama işe yarıyor. Genellikle sadece bir tane olmakla ilgilenirim, ancak yukarıdakiler çok daha az taşınabilir olabilir.

6

Burada rehberlik için dinamik olarak boyutlandırılmış yapıların bazı örneklerine bakmanız gerektiğini düşünüyorum. Bildiğim en iyi örnek Win32'daki TOKEN API'leridir. Onlar sadece 1. Raymond Chen aşağı giderir makro ANYSIZE_ARRAY onlar bu şekilde

böyle başarısız sizeof olarak operasyonlar gelince

yapılır tam olarak neden detaylandırma geniş blog makalesinde yaptığı kullanın. Dinamik boyutlu bir yapı için hangi çözümü seçerseniz seçin başarısız olur. sizeof bir derleme zamanı işlemidir ve yapıyı çalışma zamanında yeniden boyutlandırırsınız. Sadece çalışamaz.

+0

sizeof'un I, yapı sadece boyutu değil, dinamik bir alan anlamına geliyordu ve o zaman, dinamik alan okuyun. – codymanix

4

I char filename[1] kullanımı ve bir sonlandırma 0 bayt içerecek şekilde göstermektedir. Bu şekilde, doğru yapı boyutunu malloc() ve önlemek kerelik hatalarını şöyle olabilir:

ptr = malloc(sizeof(struct packet)+filename_len); 
strncpy(&ptr->filename, filename, filename_len); 

Ama alıcı o filename_len+1 bayt okumak gerektiğini bilmek gerekir.

3

Aslında standardın bir parçası zero-length arrays değildir. Ancak kod snippet'inizde sahip olduğunuz şey, ISO C99 standardının bir parçası olan esnek bir dizidir. Eğer C99'u kullanmanız mümkün ise, jesup'ın önerisi muhtemelen en iyisi değilse esnek bir dizi kullanırdım. UDP paket alırken ilk dinamik alanının boyutunu içeren yapı içinde okuma için