char*-RAM auf Struktur-Array casten: Absturz bei Zugriff

04/06/2015 - 01:46 von ha | Report spam
Hallo

Ich sehe wohl den Wald vor Bàumen nicht.

Ich möchte auf Speicher (char*) per Casting als ein
Array von Strukturen zugreifen. Aber es gibt sofort
einen Absturz.

Hier ein simples Beispiel. (Um nicht vom eigentl.
Problem in Form von Nebendiskussionen zur Form
abzulenken, habe ich die Sache als kleine
Funktion geschrieben ;-) )


void test(void)
{
struct testS
{
int x;
};

char *P;
struct testS* sP;


if (!(P = (char*)malloc(sizeof(struct testS) * 10)))
{
return;
}

sP = (struct testS*)P[0];

sP->x = 1; // Hier knallt es

// Natürlich geht dann auch das hier nicht: (struct testS*)P[0]->x 1;

free(P);
}


Was mache ich falsch? Oder liegt es am Compiler?
Ich erinnere mich, das man beim Watcom das
Struktur-Alignment einstellen konnte.

Ich arbeite unter Win7 mit dem VSE2013.
 

Lesen sie die antworten

#1 Rüdiger Ranft
04/06/2015 - 08:30 | Warnen spam
Am 04.06.2015 um 01:46 schrieb ha:
Hallo

Ich sehe wohl den Wald vor Bàumen nicht.

Ich möchte auf Speicher (char*) per Casting als ein
Array von Strukturen zugreifen. Aber es gibt sofort
einen Absturz.

Hier ein simples Beispiel. (Um nicht vom eigentl.
Problem in Form von Nebendiskussionen zur Form
abzulenken, habe ich die Sache als kleine
Funktion geschrieben ;-) )


void test(void)
{
struct testS
{
int x;
};

char *P;
struct testS* sP;


if (!(P = (char*)malloc(sizeof(struct testS) * 10)))
{
return;
}

sP = (struct testS*)P[0];


^^^
Hier greifst Du auf das erste (nicht initialisierte) Element von P zu,
und wandelst es in einen Zeiger um. Was Du eigentlich schreiben wolltest war
sP = (struct testS*)P; /* oder (struct testS*)&P[0]; */

BTW: Wenn Du ein array von testS anlegen willst, kannst Du auch calloc
verwenden:
sP = calloc(10, sizeof(*sP));

Das schützt dann auch vor Problemen wie in [1] beschrieben, hat aber den
Nachteil, dass bei vielen Umgebungen zusàtzlicher Aufwand für das
initialisieren des Speichers notwendig ist.

Bye
Rudi.

[1] https://drj11.wordpress.com/2008/06...overflows/

Ähnliche fragen