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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.