SORU
24 EKİM 2008, Cuma


C nasıl bir işaretçi bir dizi boyutunu alabilir miyim?

Bir "" bu büyüklükte mystruct n:. dizi tahsis ettim

if (NULL == (p = calloc(sizeof(struct mystruct) * n,1))) {
 /* handle error */
}

Daha sonra, ben sadece p, erişimi ve artık n. Bir şekilde 11 ** işaretçiyi verilen dizinin uzunluğunu belirlemek için var mı?

Bunu ben de düşündümgerekirmümkün olması, free(p) beri yapar. malloc() ne kadar ayrılmış izleyebilir ve uzunluğu bilir neden olduğunu biliyorum; belki de bu bilgileri sorgulamak için bir yolu var mı? Gibi bir şey...

int length = askMallocLibraryHowMuchMemoryWasAlloced(p) / sizeof(mystruct)

Sadece ** 15, ama mümkünse tercih ettim, böylece kodu yeniden işleme etmem gerektiğini biliyorum. Herhangi bir fikir?

CEVAP
24 EKİM 2008, Cuma


Hayır, şiddetle malloc uygulama ayrıntıları bağlı olmadan bu bilgileri almak için bir yolu yoktur. Özellikle malloc Mayıs isteği daha fazla bayt (belirli bir bellek mimarisi verimlilik gibi) tahsis edilecek. Çok daha iyi n açıkça kaydını tutmak, böylece kodunuzu yeniden olacaktır. Alternatifen azındankadar yeniden ve çok daha tehlikeli bir yaklaşım (verilen bu standart dışı, kötü anlam işaretçileri, ve olacak bir bakım kabusu için o senin peşine): mağaza uzunluğun malloc ... Adres, arkasından dizi. Ayırma olurdu:

void *p = calloc(sizeof(struct mystruct) * n   sizeof(unsigned long int),1));
*((unsigned long int*)p) = n;

n *((unsigned long int*)p) saklanan ve dizinin şimdi başlayın

void *arr = p sizeof(unsigned long int);

Düzenleme:Sadece şeytanın avukatlığını yapmak... bu "çözümler" tüm yeniler gerektirir, ama bakalım o zaman.biliyorum Tabii ki, çözüm yukarıda sunulan sadece bir hacky bir uygulama (dolu) yapı. De tanımlayabilirsiniz:

typedef struct { 
  unsigned int n;
  void *arr;
} arrInfo;

ve ham işaretçiler yerine arrInfos etrafında geçmek.

Şimdi yanıyoruz. Ama, neden yeniden tasarlama olduğun sürece burada duracak mı? Gerçekten ne istediğini soyut veri tipi (ADT). Algoritmalar ve veri yapıları dersi için herhangi bir tanıtım metni yapardı. Bir ADT ama gizler veri türünün ortak arabirim veri türü uygulanması tanımlar. Böylece, halka açık bir dizi için bir ADT gibi görünebilir

typedef void* arrayInfo;
(arrayInfo)newArrayInfo(unsignd int n, unsigned int itemSize);
(void)deleteArrayInfo(arrayInfo);
(unsigned int)arrayLength(arrayInfo);
(void*)arrayPtr(arrayInfo);
...

Diğer bir deyişle, bir ADT bir formun veri saklama ve davranış... başka bir deyişle, bu kadar yakın olabilirsiniz Nesne Yönelimli Programlama kullanarak düz C. Sürece sıkıştın bir platform olan yok bir C derleyici, belki de bütün domuz gidin ve sadece bir STL std::vector.

Yok, C ile ilgili basit bir soru almış ve C düştük . Tanrı hepimize yardımcı olsun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • Strata1000

    Strata1000

    28 EYLÜL 2009
  • Subscribe!!

    Subscribe!!

    3 EKİM 2009