| 

.NET C# Java Javascript Exception

1
Spiele mich gerade ein wenig mit Source Code ... warum dieser Code böse ist erschließt sich mir leider nicht ...

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

string meineftk2(int *pInt)
{
string a = "Text";
return a;
}

int main()
{

int *pInt;
*pInt = 10; // hier seg fault
string ergString = meineftk2(pInt); // kommentiere ich diese Zeile aus gibt es keinen seg fault in der oberen Zeile


return 0;
}
News:
01.05.2014
Blackstore 113 5
1 Antwort
1
Weil du mit int *pInt; nur einen Pointer definierst, aber keinen Speicherbereich auf den er zeigt. Mit *pInt = 10; schreibst du dann einen Wert in einen nicht definierten Speicherbereich¹ was im Idealfall zum Segfault führt.

Versuchs mal mit
...
int zielFuerPInt;
int *pInt = &zielFuerPInt;
*pInt = 10;
...


¹) Die meisten Compiler setzt die Adresse von nicht initialisierten Pointern auf eine bestimmte Adresse damit nicht versehentlich in einen gültigen Speicherbereich geschrieben wird sondern das Programm mit einem Segfault abbricht.

Nachtrag
Ist es nicht "dumm" wenn der Compiler beim erstellen eines Pointers ihn an eine nicht definierte Stelle zeigen lässt ?

Ob der Compiler den nicht initialisierten Pointer auf eine bestimmte ungültige Adresse zeigen lässt hängt vom Compiler und den Einstellungen ab. Bei Visual Studio wird nur im Debug-Modus eine bestimmte Adresse verwendet (ich glaube FFFF... oder so ähnlich, ist aber schon lange her). Der Sinn des ganzen ist eben, dass man einen nicht initialisierten Pointer erkennt, weil er auf eine definierte ungültige Adresse zeigt.

Ansonsten zeigt der Pointer auf irgendeine Adresse (wenn ich mich richtig erinnere, einfach auf den Wert der vorher schon im Speicher stand, bevor der Speicherbereich der Pointer-Variablen zugewiesen wurde) und das ist gefährlich. Immerhin könnte da durch Zufall eine gültige Adresse stehen und du überschreibst dann einen Speicherbereich den eigentlich eine andere Variable verwendet oder (sollte bei modernen CPUs nicht mehr gehen) wo ausführbarer Code steht.

Kleines Programm zum ausprobieren:
#include <stdio.h>

int main(void) {
int *a;

printf("a: %p\n", a);

return 0;
}


Beim gcc mit Default-Optionen wird für a immer etwas zufälliges ausgegeben.

Habe in Natura noch nie so eine Codekonstruktion wie oben gesehen. Gibt es da eine "schönere Variante"

Meinst du jetzt meinen oder deinen Code? ;) Also deinen Code habe ich für einen Teil von irgendeinem Tutorial-Beispielcode gehalten, vor allem weil pInt in meineftk2 nicht verwendet wird.

Zu meinem Code: Das ist die einfachste Variante einen gültigen Speicherbereich für pInt zu bekommen, statt dessen kannst du auch malloc oder ähnliches verwenden um Speicher zu allozieren. Was in deinem Fall sinnvoll ist hängt davon ab was du damit erreichen willst, zum Rumspielen kannst du alle Varianten durchprobieren.
01.05.2014
phg 1,6k 3
Hi, danke. Ist es nicht "dumm" wenn der Compiler beim erstellen eines Pointers ihn an eine nicht definierte Stelle zeigen lässt ? Habe in Natura noch nie so eine Codekonstruktion wie oben gesehen. Gibt es da eine " schönere Variante " ?
Blackstore 01.05.2014
Hi, hab meine Antwort ergänzt, da der Platz in Kommentaren recht begrenzt ist.
phg 02.05.2014

Stelle deine Cplusplus-Frage jetzt!