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
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 arrInfo
s 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.
Mercurial, nasıl "kompres" i...
Nasıl java monitör boyutunu alabilir m...
Nasıl YouTube API YouTube video küçük ...
Nasıl Java iki dizi bir arada olabilir...
Nasıl JavaScript para olarak format nu...