Malloc kompilieren-Fehler: der Wert vom Typ "int" kann nicht verwendet werden, zu initialisieren einer Entität vom Typ int (*)[30]
Muss ich versucht haben, 20 Möglichkeiten, dies zu tun. Ich brauche wirklich Hilfe, egal was ich mache ich bekomme eine Fehlermeldung ähnlich wie diese.
a value of type "int" cannot be used to initialize an entity of type "int (*)[30]"
d.h. diese wird mir, so ein Fehler
int(*array)[160] = malloc((sizeof *array) * 10);
etwas zu tun wie dieser
int** Make2DintArray(int arraySizeX, int arraySizeY) {
int** theArray;
theArray = (int**) malloc(arraySizeX*sizeof(int*));
int i;
for (i = 0; i < arraySizeX; i++)
{
theArray[i] = (int*) malloc(arraySizeY*sizeof(int));
}
return theArray;
}
wird mich dieser
"void *(size_t)" in "memory.c" at line 239 and: "int()"
hat jemand eine Lösung für wie man eine erfolgreiche Zuweisung eines int 2dArray[160][10]
Die gleiche Frage wie dieser stackoverflow.com/questions/1970698/...
Ja, aber ich hatte ein anderes problem, welches @WhozCraig fing für mich.
mögliche Duplikate von ich werfe das Ergebnis von malloc?
Bitte hören Sie Ihrem compiler, sagte er Sie was Ihr Fehler war. Für Ihre eigentliche Frage auf, wie definieren 2D-arrays: tun Sie nicht-Emulationen des 2d-arrays von Zeigern auf Zeiger. Eine große matrix in der modernen C e.g werden einfach zugeteilt
Ja, aber ich hatte ein anderes problem, welches @WhozCraig fing für mich.
mögliche Duplikate von ich werfe das Ergebnis von malloc?
Bitte hören Sie Ihrem compiler, sagte er Sie was Ihr Fehler war. Für Ihre eigentliche Frage auf, wie definieren 2D-arrays: tun Sie nicht-Emulationen des 2d-arrays von Zeigern auf Zeiger. Eine große matrix in der modernen C e.g werden einfach zugeteilt
double (*array)[n] = malloc(sizeof(double[n][m]));
InformationsquelleAutor WIllJBD | 2012-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese beiden compile gut für mich. Der erste Fehler ist üblich, wenn Sie vergessen,
#include <stdlib.h>
vor der Verwendung von Funktionen deklariert gesagt-gleichen (wiemalloc(size_t)
), was ich auch Tat nicht vergessen.C hat einige interessante compile-Zeit-Verhalten, unter Ihnen die Fähigkeit, eine Funktion aufzurufen, die noch nie zuvor gesehen hat (weder in der Prototyp-definition noch Umsetzung). Nach der Begegnung mit einem solchen Aufruf, C übernimmt die Funktion ist:
int
ZB., die Funktion wird implizit davon ausgegangen, dass von der form:
Oft werden Sie nicht einmal bemerken, außer für Warnungen von Ihrem compiler, der Bericht etwas zum Effekt von:
und wenn Sie on-the-ball, müssen Sie Ihre Warnung Ebenen aufgedreht mit Warnungen als Fehler aktiviert und fangen.
Aber was, wenn Sie nicht? Und was ist, wenn das "Ding" von der Funktion zurückgegeben werden können Inhalte-dargestellt durch die Größe der Daten in einer Implementierung
int
? Was ist, wenn zum Beispielint
waren 32-bit, aber die Daten, die Hinweise waren 64-bit? Angenommenchar *get_str()
deklariert ist in einigen header-Datei, die Sie nicht darunter und umgesetzt .c-Datei, kompilieren Sie und verknüpfen Sie mit Ihrem Programm,, die wie folgt aussieht:Gut, sollte der compiler kotzen, sagen Sie, dass
int
undchar*
sind nicht kompatibel (kurz nachdem es warnt Sieget_str
wird angenommen, dass die Rückkehrint
). Aber was ist, wenn Sie erzwingen, dass der compiler die hand von sagen es um einechar*
eine oder andere Weise:Nun, ohne dass Warnungen als Fehler aktiviert, erhalten Sie eine implizite Deklaration Warnung, und das ist es. Der code kompiliert wird. Aber es laufen ? Wenn
sizeof(int)
!=sizeof(char*)
, (32-bit vs 64-bit) wahrscheinlich nicht. Der zurückgegebene Wert vonget_str
ist ein 64-bit-Zeiger, aber die Anrufer ist vorausgesetzt, nur 32-bit zurückgegeben wird, dann zwingt es zu einer 64-bit-Zeiger. Kurz gesagt, der cast hat, versteckt Sie den Fehler und öffnete die Büchse der pandora von undefiniertem Verhalten.Also, wie funktioniert dies alles in Beziehung zu Ihrem code? Durch nicht einschließlich
<stdlib.h>
der compiler nicht weiß, wasmalloc
ist. Also er meint es ist von der form:Dann, indem er das Ergebnis auf
(int**)
sagst du dem compiler "was auch immer dabei heraus kommt, machen es zu einemint**
". Zur link-Zeit,_malloc
gefunden wird (keine parameter-Signatur über die name manglings wie C++), verdrahtet, und Ihr Programm ist bereit für die party. Aber auf Ihrer Plattformint
und Daten Zeiger sind nicht die gleiche Größe, so dass Sie am Ende mit mehrere unerwünschte Folgen:sizeof(int) == sizeof(int**)
.So bauen Sie diese auf Ihrem 32-bit-Debian-box, sieht alles gut aus. Sie Ihre Hausaufgaben, um den professor, der baut es auf seinem 64-bit-Mac und es stürzt ab, Sie nicht die Abtretung, nicht die Klasse, fallen aus der Schule und verbringen die nächsten zehn Jahre streicheln der Katze beim beobachten Seinfeld Wiederholungen in Ihrem mom Keller Fragen, was falsch gelaufen ist. Autsch.
Nicht behandeln, casting, wie ein paar silberne Kugel. Das ist es nicht. In C ist es erforderlich weit weniger oft als Menschen, die es verwenden, und wenn Sie in der falschen Ort verstecken können katastrophale Fehler. Wenn Sie einen Punkt in Ihrem code, wo etwas nicht kompilieren, ohne einen harten Wurf, die Blick wieder. Es sei denn, Sie sind sich absolut sicher, dass die Besetzung ist die richtige Sache zu tun, Verschiedenheit seiner falsch.
In diesem Fall versteckte er den wirklichen Fehler, dass Sie es versäumt, geben Sie genug Informationen, um dem compiler zu wissen, was
malloc
wirklich tut.Das zweite ist wichtiger. Nie warf ein malloc beim kompilieren C. Es ist nicht nötig, und blendet die Fehler, die können schrecklich sein, wenn das kompilieren auf einer Plattform, wo
int
ist eine andere Größe als ein Zeiger.Und das war es, sowohl kompilieren Sie nun in Ordnung. Danke!
froh, Sie gefunden zu haben.
Das unerklärliche unten Stimmen. Gehen Abbildung.
InformationsquelleAutor WhozCraig
Versuchen Sie dies:
In deinem Fall Zeilen = 160 und cols = 10. Ist eine mögliche Lösung.
Mit diesem Ansatz können Sie die beiden Indizes:
sizeof(int*)
?Du hast Recht! Einen Tippfehler. Ich denke, es funktionierte in diesem Fall, weil
sizeof(int) == sizeof(int *)
(in meinem PC).InformationsquelleAutor rendon
Zur Zuweisung des array:
Dann verwenden Sie code wie:
(Wo
row
geht von 0 bis 159 inclusive undcolumn
geht von 0 bis 9 inklusive.)InformationsquelleAutor David Schwartz
Ich habe einen Hinweis für die rendon Antwort:
Für seinen code, Visual C++, sagt für alle " = " - Operationen:
error C2440: '=' : cannot convert from 'void *' to 'int **'
Indem Sie einige änderungen vornehmen, es funktioniert für mich, aber ich bin mir nicht sicher, dass es nicht das gleiche, so dass ich Angst vor der Bearbeitung seiner code. Statt, hier ist mir code, das scheint zu funktionieren, für einen ersten Eindruck.
Tatsächlich, ich habe es mit einer custom
struct
stattint
s, aber ich denke so oder so sollte es funktionieren.new[]
statt.Ja, ich benutze C++. Danke.
InformationsquelleAutor Zoltán Schmidt
Don ' T mind me, ich bin nur hinzufügen ein Beispiel mit calloc
Siehe : stackoverflow.com/a/855780/68805
InformationsquelleAutor Reno
2D-array zu speichern char *
InformationsquelleAutor gkiko