Ungültige Anwendung von sizeof auf einen unvollständigen Typ mit einer Struktur
Lesezeit: 5 Minuten
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
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.
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.
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?
Ist ‘char[]’ unvollständiger Typ? oder
‘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
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:
@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
14336700cookie-checkUngültige Anwendung von sizeof auf einen unvollständigen Typ mit einer Strukturyes
Ü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