Yeniden tahsis beklenen bildirim belirticileri veya 'sizeof' hatasından önceki '…' nasıl düzeltilir?
Aradıktan sonra aşağıdaki hatayı alıyorum realloc
void* realloc(sizeof(char)100);
Hata:
linex.c: 23: 16: hata: beklenen bildirim belirticileri veya "sizeof" dan önce "..."
Lütfen yardım et. Teşekkür ederim. :)
Yanıtlar
void realloc(sizeof(char)100);
Standart realloc()
işleve (özel bir bildirim değil) yapılan bir çağrıyı kastettiğinizi realloc()
ve belleği yeniden boyutlandırmak istediğinizi varsayarsak , bu kod üç noktada yanlıştır.
1.
realloc()
bir bellek yönetimi tarafından ayrılmış belleğe bir göstericiye ihtiyaç duyar ve ilk argüman olarak henüz serbest bırakılmamıştır.
Bu, standart realloc()
işlev için prototip / bildirimdir :
void *realloc( void *ptr, size_t new_size );
Kişisel realloc()
çağrı bu işaretçi değişkeni atlar.
2.
void *
Bir işlevi çağırmak istediğinizde dönüş türünü (burada ) belirtmeyin . Bununla, realloc()
bir çağrı değil , işlevin yeni bir bildirimini yapmaya çalışırsınız .
Burada biraz döküm yapmaya çalıştıysanız, bu da yanlış. Örtük bir atama için, çevrilecek türü parantez içine almalısınız (void *)
.
Her iki durumda da atamanın gereksiz olduğunu unutmayın. Dönüş türünün oyuncu kadrosunu görerek, şunlara bir göz atın:
- Malloc'un sonucunu yayınlıyor muyum?
3.
Boyut bağımsız değişkeninde ve *
arasında operatöre ihtiyacınız var .sizeof(char)
100
Kullanım:
realloc( ptr, sizeof(char) * 100 );
Ayrıca, bir hata oluşmuş olsun veya olmasın, bellek yönetimi işlevlerinin dönüş değerini her zaman kontrol etmeniz gerektiğini unutmayın:
char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
fputs("Error at resizing the allocated memory!\n", stderr);
// error routine.
}
Her zaman için aynı şeyi yapmalısınız malloc()
:
char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
fputs("Error at memory allocation!\n", stderr);
// error routine.
}
İleri düzey ders (Bu noktada anlamanıza gerek yok):
realloc()
Durumunda, dönüş değerini yakalamak için farklı bir işaretçi kullandığımı unutmayın realloc()
.
Bunun nedeni realloc()
, argüman olarak iletilen aynı göstericiyi döndürebilir veya döndürmeyebilir.
Maalesef yaygın ama kötü bir uygulama, ilk argüman olarak geçirilen işaretçiyi dönüş değerine göre yeniden atamaktır realloc()
.
Bu tehlikelidir, çünkü ilk olarak tahsis edilen belleğe referans, realloc()
başka bir "değiştirme" belleği tahsis edilirse ancak ilkini silmediyse kaybolabilir .
İlişkili:
- Realloc () tarafından döndürülen adresi aynı işaretçiye atamak iyi bir kodlama uygulaması mıdır?
- https://stackoverflow.com/a/25435175/12139179
- Realloc () belleği nasıl yeniden tahsis eder?
void* realloc(sizeof(char)*100);
bir işlev bildirip çağırmanın karmaşasıdır.
Bir fonksiyonu tanımladığımızda , olduğu gibi dönüş tipinin ne olduğunu ve parametrelerinin ne tip olduğunu söyleriz void *realloc(void *, size_t);
. Ayrıca, 'de olduğu gibi, yararlı açıklamalar olarak parametreler için yer tutucu adları da sağlayabiliriz void *realloc(void *pointer, size_t size);
. (Fonksiyonu tam olarak tanımlarken parametre adları gereklidir.)
Bir fonksiyonu çağırdığımızda , dönüş değeri veya parametreler için tür isimleri vermeyiz. Sadece argüman değerlerini sağlayan ifadeler veriyoruz NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
.
Bazen tür adları bir işlev çağrısında veya yakınında görünebilir, ancak bunlar önemsizdir ve işlev çağrısının doğrudan bir parçası değildir. Örnekler:
char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
: Bu kod,char *
çünkü açıklar ve tanımlarNewPointer
. Daha sonra çağrıNewPointer
ile başlatılırrealloc
.NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);
: Bu kodun(char *)
dönüş değerinirealloc
belirli bir işaretçi tipine dönüştürmek için bir çevrim vardır. Bu, C'de gerekli değildir.NewPointer = realloc(OldPointer, 100 * sizeof(char));
: Bu kod, gerekli alanı hesaplamak içinchar *
bir işlenene sahiptirsizeof
. Bu gereksizdir çünkü boyut ile birlikte alınabilirsizeof *NewPointer
ve bu genellikle tercih edilir çünkü bildirimindeki değişikliklere otomatik olarak uyum sağlar, bildirimindekiNewPointer
türü değiştirerekNewPointer
ancaksizeof
ifadeyi göz ardı ederek bir hatanın ortaya çıkma olasılığını azaltır .