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
typedefstruct{
2
floatxn,yn,zn;
3
floatx1,y1,z1;
4
floatx2,y2,z2;
5
floatx3,y3,z3;
6
}TRIANGLE;
7
8
9
10
intReadSTL(void){
11
inti,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
return0;
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
heinz schrieb:> Wenn ich den realloc rausnehm funktioniert es.> Was sehe ich da nicht?
schau doch mal in der doku nach wie realloc funktioniert, achte dabei
mal auf das "return" der funktion!
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?
heinz schrieb:> laut Doku sollte der realloc einen Nullpointer zurückgeben wenn er fehl> schlägt.
und was was liefert er zurück wenn es keinen fehler gibt?
tipp: wie soll sich denn t ändert, wenn du ihn an eine funktion
übergibst?
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:
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.
Hans schrieb:> p[i] = *(p + (i * sizeof(p)))>> dereferenzieren nicht vergessen :-)
Das ist doch nicht richtig. Richtig ist
p[i]=*(p+i)
das 'sizeof' passiert automatisch.