Problem mit realloc?

Gast #3332149
Lesenswert?

Hallo,
ich versuch mich gerade an einem Slicer für STL Modelle und hab ein 
Problem
mit der Speicherallocation

OS ist Windows XP
Compiler PellesC
Sprache C

Bis auf den Fehler alles rausgelöscht

aufgerufen wird aus WindowProc durch Tastendruck

1
typedef struct{
2
  float xn,yn,zn;
3
  float x1,y1,z1;
4
  float x2,y2,z2;
5
  float x3,y3,z3;
6
} TRIANGLE;
7

8

9

10
int ReadSTL(void){
11
int i,max;
12
TRIANGLE *t=NULL;
13

14
  max=2000;
15
  t=malloc(max*sizeof(TRIANGLE));
16

17
  max=30000;
18
  realloc(t,max*sizeof(TRIANGLE));
19
  if (t==NULL) return -1;
20
  for (i=0;i<=2000;i++){
21
    t[i].z3=(FLOAT)5.5;
22
  }
23
  return 0;
24
}

gibt beim schreiben auf t[i].z3 (i=12) eine Zugriffsverletzung
Wenn ich den realloc rausnehm funktioniert es.
Was sehe ich da nicht?

Gruss heinz
Gast #3332162
Lesenswert?

laut Doku sollte der realloc einen Nullpointer zurückgeben wenn er fehl 
schlägt.

Ich kann mit dem Debugger verfolgen, dass der in dem Programmteil bleibt 
bis zum bitteren Ende

Das wollte ich eigentlich in "PC Hard & Software" posten, kann das 
jemand verschieben?
#3332175
Lesenswert?

Hallo,

realloc kann den übergebenen Wert von t nicht ändern, deshalb gibt es 
den neuen Wert zurück.
Also so anwenden:
1
typedef struct{
2
  float xn,yn,zn;
3
  float x1,y1,z1;
4
  float x2,y2,z2;
5
  float x3,y3,z3;
6
} TRIANGLE;
7

8

9

10
int ReadSTL(void){
11
int i,max;
12
TRIANGLE *t=NULL;
13

14
  max=2000;
15
  t=malloc(max*sizeof(TRIANGLE));
16

17
  max=30000;
18
  t = realloc(t,max*sizeof(TRIANGLE));
19
  if (t==NULL) return -1;
20
  for (i=0;i<=2000;i++){
21
    t[i].z3=(FLOAT)5.5;
22
  }
23
  return 0;
24
}
(Firma: Schweigstill IT) Persönliche Seite #3332279
Lesenswert?

Es gibt noch ein weiteres potentielles Problem, nämlich das Alignment 
eines Arrays von TRIANGLE. Daher kann das Array mehr Speicher benötigen 
als max*sizeof(TRIANGLE).

Die derzeitige Definitoin von TRIANGLE dürfte das Problem zwar nicht 
aufweisen, wohl jedoch:
1
typedef struct{
2
  float xn,yn,zn;
3
  float x1,y1,z1;
4
  float x2,y2,z2;
5
  float x3,y3,z3;
6
  uint8_t a;
7
} TRIANGLE;
Gast #3332290
Lesenswert?

Andreas Schweigstill schrieb:
> Es gibt noch ein weiteres potentielles Problem, nämlich das Alignment
> eines Arrays von TRIANGLE. Daher kann das Array mehr Speicher benötigen
> als max*sizeof(TRIANGLE).

nein das dürfte NIE ein problem werden. Dann dann könnte man überhaupt 
keine Programme schreiben.

ein index zugriff ist immer

p[i] = p + (i * sizeof(p))

entweder wird durch das Alignment das sizeof mit größer oder halt nicht. 
Dann gibt es auch keine lücken.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren