Yeniden tahsis beklenen bildirim belirticileri veya 'sizeof' hatasından önceki '…' nasıl düzeltilir?

Aug 15 2020

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

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
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?
1 EricPostpischil Aug 15 2020 at 17:35

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ımlar NewPointer. Daha sonra çağrı NewPointerile başlatılır realloc.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Bu kodun (char *)dönüş değerini reallocbelirli 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çin char *bir işlenene sahiptir sizeof. Bu gereksizdir çünkü boyut ile birlikte alınabilir sizeof *NewPointerve bu genellikle tercih edilir çünkü bildirimindeki değişikliklere otomatik olarak uyum sağlar, bildirimindeki NewPointertürü değiştirerek NewPointerancak sizeofifadeyi göz ardı ederek bir hatanın ortaya çıkma olasılığını azaltır .