Invalid Null Pointer mit VS2008
-
Wow, Blitzantwort^^
also:
std::string x;
cin >> x;ist mir zu... wie soll ich sagen? Ich möchte gerne beim Programmieren verstehen, was ein Pointer wirklich ist und tut.
char x[256];
cin >> x;ist gut für mich. Danke! Allerdings verstehe ich eine kleine Sache noch nicht.
Was ist der Unterschied zwischenchar x[256];
und
char *x; ?
Kann ich mir vorstellen, dass char x[256]; direkt den passenden Speicher allokiert, wohin char *x; genau das nicht tut?
-
Santus schrieb:
ist mir zu... wie soll ich sagen? Ich möchte gerne beim Programmieren verstehen, was ein Pointer wirklich ist und tut.
Zeiger sind ein Thema das man vielleicht nicht als erstes in C++ zu verstehen versuchen sollte, sondern in einen zweiten Schritt.
char x[256];
char *x;Ersteres ist ein Array von 256 Zeichen (Index 0..255), zweiteres ein Zeiger ohne Speicher dahinter (er zeigt ja noch nicht auf irgendetwas sinnvolles).
-
Das mit dem Zeiger ohne Speicher dahinter ist mir klar. Ich hatte wohl darauf gehofft, dass mir Windows irgendwie SPeicher dafür klarmacht. Wie Du sagst klappt es so unter VS2003 natürlich auch nicht. Das mit dem Vergleich hinkt dann nicht mehr, wenn man...
char* str; str = (char*) malloc(sizeof(char*)*256);ist gleich
char str[256];sagen würde, oder?
P.S.: Warum ist void main() kein c/c++?? Das steht so auch massig in meinem Lehrbuch.
-
Ist nicht ganz das gleiche. In den meisten Fällen spielt das aber keine Rolle.
Das erste ist ein char Zeiger, dem du dann auf den Anfang eines Speicherbereiches zeigen lässt.
Das zweite ist ein Array von char's. Der str lässt sich aber implizit zu einem Zeiger auf char casten.
Unterschiede gibts, wenn du den Zeiger inkrementieren willst (was geht) und dann dasselbe bei einem Array versuchst (was nicht geht).
Oder auch, wenn du sizeof auf ein Array anwendest (gibt dann die Grösse des Arrays zurück) und dann das mal bei einem Zeiger versuchst, der auf Speicher zeigt (gibt die Grösse des Zeigertypes zurück. Üblicherweise 4 ).@void main:
Das ist so, weil es im Standard so beschrieben ist, dass int main () und int int main (int argc, char* argv[]) gültiges C++ sind. Sprich, weil da nicht steht, dass void main () gültig ist.Siehe: ISO/IEC 14882 3.6.1
-
Unterschiede gibts, wenn du den Zeiger inkrementieren willst (was geht) und dann dasselbe bei einem Array versuchst (was nicht geht).
Oder auch, wenn du sizeof auf ein Array anwendest (gibt dann die Grösse des Arrays zurück) und dann das mal bei einem Zeiger versuchst, der auf Speicher zeigt (gibt die Grösse des Zeigertypes zurück. Üblicherweise 4 ).Supi. Jetzt hab ich es! Danke!!!
-
Und statt malloc/free new/delete verwenden.

-
Santus schrieb:
...Ich möchte gerne beim Programmieren verstehen, was ein Pointer wirklich ist und tut....
Dann würde ich Dir vorschlagen, auch eine Aufgabe zu wählen, bei der es um Zeiger geht (z.B. Liste selbst programmieren) und nicht eine Aufgabe, die man viel schneller, besser, sicherer, ... mit Standardmitteln lösen kann.
Du würdest doch auch nicht Autofußball spielen, wenn Du begreifen willst, wie man Scheibenwischer bedient, oder ?
"Zeiger" hat übigens verschiedene Aspekte, die man gut (=besser) einzeln lernt:
- "Verweislogik" (geht aber in bestimmten Grenzen mit Referenzen)
- Zeigerarithmetik (üblicherweise in Arrays; kann man aber auch prima mit Iteratoren lernen)
- dynamische Speicherverwaltung
- virtual-Polymorphie (geht auch gut mit Referenzen)Mach einfach zu jedem eine kleine Übung, dann lernst Du mehr dabei, als wenn Du durch den 1000ten Versuch stolperst, std::string neu zu erfinden....
Gruß,
Simon2.
-
Santus schrieb:
P.S.: Warum ist void main() kein c/c++?? Das steht so auch massig in meinem Lehrbuch.
Hem, dann ist das Buch entweder veraltet oder schlecht. Beides nicht gerade gut, um vernünftig C++ zu lernen. Wäre vielleicht ein aktuelles und gutes Buch nötig...
-
Santus schrieb:
P.S.: Warum ist void main() kein c/c++?? Das steht so auch massig in meinem Lehrbuch.
Hat darauf noch niemand reagiert? Hey, ihr Helfer, helft dem armen Kerl doch! Dann mach ich es halt:
SCHMEISS DAS LEHRBUCH SOFORT IN DEN MÜLLEIMER!!!
Seit 10 Jahren besteht der Standard und seither ist ganz klar, dass
void mainkein gültiges C++ ist. Wenn dein Lehrbuch sowas also massig einsetzt, dann kannst du ziemlich davon ausgehen, dass du auch sonst kein gültiges C++ lernst! Wahrscheinlich auch noch Dinge wieiostream.hund solchen Unsinn.Gute Lehrbücher für aktuelles C++ sind wohl die folgenden Zwei:
- Thinking in C++ 1&2 (auch als gratis PDF verfügbar)
- C++ Primer
Grüssli
-
Hat darauf noch niemand reagiert? Hey, ihr Helfer, helft dem armen Kerl doch!
Mist. Wusste doch, dass ich noch was sagen wollte.
(Ne, im ernst. War wirklich auch das erste, was ich gedacht habe, aber nicht das erste, was ich geschrieben habe.. ;))
-
Aber das er offensichtlich ein schlechtes Buch verwendet, erklärt auch, weshalb er mit Pointern anfängt.

-
Hi noch was:
Santus schrieb:
char* str; str = (char*) malloc(sizeof([b]char*[/b])*256);Ist falsch, weil "char*" ein Pointer is und der hat afaik unter einem 32Bit System IMMER 4Byte groß ist.
Also würdest du 4256 = 1024Byte anfordern was du denk ich mal nicht willst oder?
Also einfach den '' weglassen ;).Grüßli Pingu
-
Pingu-Group schrieb:
Also würdest du 4*256 = 1024Byte anfordern was du denk ich mal nicht willst oder?
Es ist immernoch leichter unter C++ new/delete zu verwenden, auch von der reinen Handhabung her

-
Bücherkenner schrieb:
Santus schrieb:
P.S.: Warum ist void main() kein c/c++?? Das steht so auch massig in meinem Lehrbuch.
Interessant ist auch, dass Visual Studio
void main(void)nicht anmeckert. g++ unter Linux tut das durchaus und fordert in der Funktion main ein return für die int Rückgabe ein. Dort könnte man einem Anfänger (nur dem?) auch den Compilerschlater -pedantic empfehlen um auf reines ISO C++ zu prüfen. Gibt es etwas vergleichbares für Visual C++?
Gruß,
Bitshift
-
BitShift schrieb:
Interessant ist auch, dass Visual Studio
void main(void)nicht anmeckert... Gibt es etwas vergleichbares für Visual C++?
Zumindestens wenn man die Warnstufe auf 4 eingestellt, und die "Language Extensions" deaktiviert, bekommt man dann auch unter VC++ eine Warnung
warning C4326: return type of 'main' should be 'int' instead of 'void'cu André
-
asc schrieb:
Zumindestens wenn man die Warnstufe auf 4 eingestellt, und die "Language Extensions" deaktiviert, bekommt man dann auch unter VC++ eine Warnung
Aber wehe dir, wenn deine Datei mit einem //-Kommentar endet..

-
drakon schrieb:
Aber wehe dir, wenn deine Datei mit einem //-Kommentar endet..

Da (soviel ich weiß auch im Standard stehend), die letzte Zeile eine Leerzeile sein muss, ist das uninteressant

-
asc schrieb:
die letzte Zeile eine Leerzeile sein muss, ist das uninteressant

Muss sie nicht. Es muss nur das letzte Zeichen ein newline sein...
-
asc schrieb:
Da (soviel ich weiß auch im Standard stehend), die letzte Zeile eine Leerzeile sein muss, ist das uninteressant

<nitpick>
Im Standard steht, dass eine Zeile eine von \n abgeschlossene Einheit ist. Demnach muss ein Quellfile keine Leerzeile am Ende enthalten, sondern es muss lediglich die letzte Zeile durch \n abgeschlossen sein. Dass das wie eine Leerzeile aussieht, ist ein Problem der Editoren.
</nitpick>
-
BitShift schrieb:
Dort könnte man einem Anfänger (nur dem?) auch den Compilerschlater -pedantic empfehlen um auf reines ISO C++ zu prüfen. Gibt es etwas vergleichbares für Visual C++?
Nicht nur dem Anfänger. Wer portablen Code produzieren will sollte auch als Fortgeschrittener oder Profi hin und wieder auf -pedantic zurückgreifen und die entsprechenden Meldungen eliminieren. Was -pedantic bei VC angeht: Ich bezweifle dass es das dort gibt. Mit seinen diversen Eigenheiten wie den bereits genannten Language Extensions und deliberatem Nicht-implementieren von Standard-Features (alternative tokens wie and, or, etc., exception pecifications, ...) dürfte es für VC schwierig sein, auf extreme Standardkonformität zu pochen. "-pedantic: use another compiler."
