Ungültige Anwendung von sizeof auf einen unvollständigen Typ mit einer Struktur

Lesezeit: 5 Minuten

Benutzeravatar des Kapitäns
Kapitän

Ich habe eine Struktur, in der ich alle Informationen über die Spieler ablege. Das ist meine Struktur:

struct player{
   int startingCapital;
   int currentCapital;
   int startingPosition;
   int currentPosition;
   int activePlayer; 
   int canPlay;      
};

Und das ist mein wichtigstes:

#include <stdio.h>
#include <stdlib.h>
#include "header.h"


int main(int argc, char *argv[])
{  int s,i,numOfPlayers;
   struct player *players;
    printf("Give the number of players: \n");
    scanf("%d",&numOfPlayers);

    players = (struct player *)calloc(numOfPlayers,sizeof(struct player));


   system("PAUSE"); 
  return 0;
}

Ich bitte den Benutzer, die Anzahl der Spieler anzugeben, und versuche dann, den benötigten Speicher zuzuweisen. Aber ich bekomme diesen Compiler-Fehler, den ich nicht herausfinden kann:

invalid application of `sizeof' to incomplete type `player'  

  • Übrigens: stackoverflow.com/questions/605845/…

    – ChrisWue

    18. Januar 2012 um 18:23 Uhr

  • Hast du struct player in header.h deklariert?

    – MetallicPriest

    18. Januar 2012 um 18:23 Uhr

  • Wenn header.h die Definition von “player” enthält, sollte dieses Programm gut kompilieren, sowohl in C als auch in C++

    – Renan Greinert

    18. Januar 2012 um 18:25 Uhr

Benutzeravatar von cnicutar
Cnicutar

Es bedeutet die Datei, die main hat keinen Zugriff auf die player Strukturdefinition (dh weiß nicht, wie sie aussieht).

Versuchen Sie es einzufügen header.h oder machen Sie eine Konstruktor-ähnliche Funktion, die es zuweist, wenn es ein undurchsichtiges Objekt sein soll.

BEARBEITEN

Wenn Sie die Implementierung der Struktur verbergen möchten, tun Sie dies in einer C-Datei, die Zugriff auf die Struktur hat:

struct player *
init_player(...)
{
    struct player *p = calloc(1, sizeof *p);

    /* ... */
    return p;
}

Wenn die Implementierung jedoch nicht versteckt werden soll – dh main sollte rechtlich sagen p->canPlay = 1 Es wäre besser, die Definition der Struktur einzufügen header.h.

  • In die Kopfzeile habe ich einfach “struct player;” eingefügt. Ich mochte es am Anfang nicht, aber wenn ich so etwas wie “players.startinCapital=1500” mache, bekomme ich keinen Fehler und es gibt das Ergebnis ohne Probleme aus. Also muss ich im Grunde eine Funktion erstellen, die die Struktur erstellt?

    – Kapitän

    18. Januar 2012 um 18:24 Uhr

  • @captain hat die vollständige Deklaration der struct player Geben Sie Ihre Datei header.h ein

    – au

    18. Januar 2012 um 18:26 Uhr

  • @ouah Ich habe das gemacht und es funktioniert. Was soll ich in den init_player einfügen?

    – Kapitän

    18. Januar 2012 um 18:31 Uhr


  • Ich habe das ähnliche Problem. Und ich verwende eine Bibliothek eines Drittanbieters, daher kann ich die Implementierung nicht abrufen. Aber ich muss die Größe der Struktur erhalten (um sie an andere Bibliotheken weiterzugeben). Wie macht man das?

    – Toni Han

    17. August 2016 um 17:41 Uhr


Die Ursache von Fehlern wie “Ungültige Anwendung von sizeof auf unvollständigen Typ mit einer Struktur … ” ist immer das Fehlen einer Include-Anweisung. Versuchen Sie, die richtige Bibliothek zum Einbinden zu finden.

Benutzeravatar von alexfrigo
alexfrigo

Ihr Fehler wird auch angezeigt, wenn Sie versuchen, auf die zuzugreifen sizeof() eines nicht initialisierten externen Arrays:

extern int a[];
sizeof(a);
>> error: invalid application of 'sizeof' to incomplete type 'int[]'

Beachten Sie, dass Sie eine erhalten würden array size missing Fehler ohne die extern Stichwort.

Benutzeravatar von Morte69
tot69

Ich denke, das Problem ist, dass Sie setzen #ifdef Anstatt von #ifndef an der Spitze Ihrer header.h Datei.

Ich bin ein Anfänger und kann die Syntax nicht löschen. Obige Informationen zu beziehen, ist mir immer noch nicht klar.

/*
 * main.c
 *
 *  Created on: 15 Nov 2019
 */

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#include "dummy.h"

char arrA[] = {
        0x41,
        0x43,
        0x45,
        0x47,
        0x00,
};

#define sizeA sizeof(arrA)

int main(void){

    printf("\r\n%s",arrA);
    printf("\r\nsize of = %d", sizeof(arrA));
    printf("\r\nsize of = %d", sizeA);

    printf("\r\n%s",arrB);
    //printf("\r\nsize of = %d", sizeof(arrB));
    printf("\r\nsize of = %d", sizeB);


    while(1);

    return 0;
};

/*
 * dummy.c
 *
 *  Created on: 29 Nov 2019
 */


#include <stdio.h>
#include <stdint.h>
#include <string.h>

#include "dummy.h"


char arrB[] = {
        0x42,
        0x44,
        0x45,
        0x48,
        0x00,
};

/*
 * dummy.h
 *
 *  Created on: 29 Nov 2019
 */

#ifndef DUMMY_H_
#define DUMMY_H_

extern char arrB[];

#define sizeB sizeof(arrB)

#endif /* DUMMY_H_ */

15:16:56 **** Incremental Build of configuration Debug for project T3 ****
Info: Internal Builder is used for build
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.c" 
In file included from ..\main.c:12:
..\main.c: In function 'main':
..\dummy.h:13:21: **error: invalid application of 'sizeof' to incomplete type 'char[]'**
 #define sizeB sizeof(arrB)
                     ^
..\main.c:32:29: note: in expansion of macro 'sizeB'
  printf("\r\nsize of = %d", sizeB);
                             ^~~~~

15:16:57 Build Failed. 1 errors, 0 warnings. (took 384ms)

Sowohl “arrA” als auch “arrB” sind abrufbar (ausdrucken). Kann jedoch keine Größe von “arrB” erhalten.

Was ist da ein Problem?

  1. Ist ‘char[]’ unvollständiger Typ? oder
  2. ‘sizeof’ akzeptiert die externe Variable/Label nicht?

In meinem Programm sind “arrA” & “arrB” konstante Listen und vor dem Kompilieren festgelegt. Ich möchte ein Etikett verwenden (leicht zu warten und RAM-Speicher sparen).

  • @nhahtdh Danke für deinen Rat. Aber es passiert mit einem anderen Problem. Außerdem wird zunächst #ifndef verwendet, um eine mehrfache Deklaration zu vermeiden. Recht? Wenn nicht, teilen Sie mir bitte die Details mit.

    – lc2047

    3. Dezember 2019 um 7:45 Uhr


Benutzeravatar von user3075315
Benutzer3075315

Wirklich spät zur Party hier, aber ein Sonderfall der oben genannten Gründe für diesen Fehler wäre einfach, eine Struktur mit sizeof() oben zu referenzieren, wo die Struktur definiert ist:

int numElements = sizeof(myArray)/sizeof(myArray[0]);
.
.
.
myArray[] = 
{
    {Element1},
    {Element2},
    {Element3}
};

  • @nhahtdh Danke für deinen Rat. Aber es passiert mit einem anderen Problem. Außerdem wird zunächst #ifndef verwendet, um eine mehrfache Deklaration zu vermeiden. Recht? Wenn nicht, teilen Sie mir bitte die Details mit.

    – lc2047

    3. Dezember 2019 um 7:45 Uhr


1433670cookie-checkUngültige Anwendung von sizeof auf einen unvollständigen Typ mit einer Struktur

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy