Sehr sehr seltsames Problem
-
Hallo Leute,
ich habe ein Problem; ich denke es liegt irgendwie am Speicher aber ich weiss nicht wie ich es beheben kann...
folgends:
ich habe ein programm in dem ich zuvor eine int array namens rest intitialisiert hatte und dann irgendwann diese array bzw einzig und allein ein anderes array mit anderem namen verwende, das alte namens rest wird in einem funktionsaufruf mit dem neuem ersetzt.
jetzt das komische das programm läuft wenn ich das array rest weiterhin im programm drinnen lass, es kommt auch die Meldung beim compilieren:
unused variable rest .. ist ja auch klar ..
sobald ich rest auskomentiere kompiliert er zwar aber das programm stürzt mit folgender Fehlermeldung ab:
38 [main] test 1356 _cygtls::handle_exceptions: Error while dumping state (
probably corrupted stack)
Segmentation fault (core dumped)das ist jawohl voll komisch , auch bestätigt das warning "unused variable rest"
das ich garnix mehr mit der mache,also klar könnt ihr nun sagen lass doch einfach die variable im programm, aber das finde ich erstens unschön und zweitens würds mich extrem interessieren was das ist und was ich dagegen machen kann.. weiss jemand rat?
-
*Glaskugel such*
*Glaskugel benutz*
Ahh, ich weiß. Du hast einen Fehler in deinem Code
Nein, jetzt mal im ernst: Ein Stückchen relevanter Code oder ein Minimal-Beispiel wären schon ganz nützlich.Gruß
DOn06
-
also in die Glaskugel hab ich auch erstmal reingeguckt
ich habs gelöst, die funktion der ich die arrays übergeben habe waren von einer bib, so dass ich wohl nicht auf die größe des arrays gachtet habe, also ein zu kleines übergeben habe..
jetzt nehme ich mal an das die funktion in den speicher von rest geschrieben hat, da das andere array zu klein war (warum auch immer, scheinbar automatisch) und wenn ich eben das array rest auskomentiert hatte war wohl kein speicher mehr zu verfügung und des prog ist abgestürzt
das ist so grob meine vermutung
naja läuft jetzt, aber sowas finden ist echt eine sache der glaskugel oder man schaut sich funktionen einer bib eben bevor man sie benutzt genauer an *selbstdiss*
:p
#edit:
ich denke aber hier haben wir ein schönes beispiel was passieren kann wenn eine funktion mit beliebig großen arrays definiert wird also z.b:
void funk_name(unsigned int * array, unsigned int *array) { ... }
und man beim aufruf nicht auf die speicherreservierung achtet
-
alfredo78 schrieb:
ich denke aber hier haben wir ein schönes beispiel was passieren kann wenn eine funktion mit beliebig großen arrays definiert wird also z.b:
die funktion erwartet nur zwei pointer auf int. von beliebig grossen arrays kann man in dem fall nicht ausgehen (auch wenn die parameter 'array' heissen).
-
pedantic-freak schrieb:
alfredo78 schrieb:
ich denke aber hier haben wir ein schönes beispiel was passieren kann wenn eine funktion mit beliebig großen arrays definiert wird also z.b:
die funktion erwartet nur zwei pointer auf int. von beliebig grossen arrays kann man in dem fall nicht ausgehen (auch wenn die parameter 'array' heissen).
ich dachte int * name ist das selbe wie wie int name[]
und int name[] ist doch ein array beliber größe
-
alfredo78 schrieb:
ich dachte int * name ist das selbe wie wie int name[]
jein, 'int *name' ist ein pointer. 'int name[]' ist sowas wie eine ersatzschreibweise für pointer, allerdings wird hiermit ausgedrückt, dass ein array referenziert wird und nicht nur ein einzelner int-wert (wie bei int *name). so'n 'int name[]' kann man z.b. als funktionsparameter nehmen oder als 'extern', wenn die variable wo anders definiert wurde. aber man kann damit keine objekte anlegen.
void f() { int name[]; // <--- hier beschweren sich compiler, dass die länge fehlt ... }
... und wenn man arrays an funktionen übergibt, dann muss auch irgendwo die länge mitgegeben werden. entweder als weiteres argument, oder die länge ist immer konstant und die funktion 'weiss' das, oder die länge steckt im array mit drin (z.b. am anfang oder, wie bei strings, als 0 am ende).