C Anfänger - Xcode Problem mit Speicher??

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Xaver2k
Beiträge: 5
Registriert: Mo Dez 23, 2013 1:42 pm

C Anfänger - Xcode Problem mit Speicher??

Beitrag von Xaver2k » Mo Dez 23, 2013 2:27 pm

Hallo
ich habe ein kleines Testprogramm geschrieben um ein wenig den Umgang mit Arrays und Strukturen zu üben.

Natürlich klappt das nicht so wie ich will :o

auf den Bilschirmfotos kann man erkennen das sobald "i" in der "for"-schleife den Wert 4 hat es zu einer Fehlermeldung kommt...
Verstehe allerdings nicht warum, denn wenn ich "i" in der "for"-schleife mit 10 initialisiere dann läuft das ganze ohne probleme durch
und im oberen bild sieht man was passiert wenn ich die schleife mit 5 initialisiere... (Output fenster rehts unten)
und das ergibt für mich erst recht keinen sinn????? :? :?
hat jemand eine erklärung dafür??
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C Anfänger - Xcode Problem mit Speicher??

Beitrag von cloidnerux » Mo Dez 23, 2013 2:38 pm

auf den Bilschirmfotos kann man erkennen das sobald "i" in der "for"-schleife den Wert 4 hat es zu einer Fehlermeldung kommt...
Das Problem liegt an einer anderen Stelle:

Code: Alles auswählen

unsigned int i = 0;
struct Werte values[i];
Du legst ein Array mit 0 Elementen an.
Dann greifst du bei einem Array mit 0 Elementen auf ein Element größer 0 zu, was dazu führt, dass du irgendwo in deinem Arbeitsspeicher werte änderst und dass führt zu den Problemen.

Ein Array ist eine Aneinanderreihung der Variablen/Strukturen mit denen du das Array anlegst. Bedeutet, legst du ein int array an:

Code: Alles auswählen

int array[5];
hast du 5 ints(normalerweise 4 Byte pro int), die im Speicher direkt hintereinander liegen.
Wenn du nun auf

Code: Alles auswählen

array[2]
zugreifst, rechnet dein Compiler die Startaddresse und die 2 vorhegenden Elemente so um, dass du auf das 3 Element(Index beginnt bei 0) zugreifen kannst. Daraus ergibt sich, dass dein Computer und dein Compiler nicht wissen, wie lang dein Array ist und du selber darauf achten musst, nicht über die Grenzen hinweg zu lesen, was möglich ist.
Was passiert hast du ja bemerkt. Du liest über die Grenzen deines Arrays hinweg im Speicher und da kann nun alles mögliche stehen. Du veränderst nun diesen inhalt, von dem du nicht weist wozu er gehört und dass kann dazu führen, dass dein Programm abschmiert.

Was du also machen musst, ist dein Array mit einer gewissen Zahl an Elementen zu initialisieren:

Code: Alles auswählen

struct Werte values[10];    //Ein Array mit 10 Elementen
Dann musst du aber immer noch beachten, dass dein größter Index in diesem Fall 9 wäre(Länge - 1, da Index bei 0 beginnt).

Was auch zu beachten ist, ist die Tatsache das Arrays statisch sind. Du musst vor dem Compilieren angeben, wie groß sie sein sollen. Willst du dynamisch Elemente hinzufügen, musst du dir Datenstrukturen wie Listen anschauen, das erfordert dann aber gutes Verständnis von Pointern.

Mit freundlichen Grüßen

cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Xaver2k
Beiträge: 5
Registriert: Mo Dez 23, 2013 1:42 pm

Re: C Anfänger - Xcode Problem mit Speicher??

Beitrag von Xaver2k » Mo Dez 23, 2013 3:27 pm

aahhh ja da merkt man wieder diese unerfahrenheit... das problem war nur die falsche definiton
Super vielen Dank!
aber was ich auch nicht verstehe ist das er beim initialiesieren in der schleife i=5... im Output dann 5,0,1,2,3 ausgegeben hat (den fehler macht er jetzt aber auch nichtmehr)
das hat er beim intialisieren mit i=10 nicht gemacht, da hat er normal ab 10,11,12... hochgezählt?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C Anfänger - Xcode Problem mit Speicher??

Beitrag von cloidnerux » Mo Dez 23, 2013 3:42 pm

aber was ich auch nicht verstehe ist das er beim initialiesieren in der schleife i=5... im Output dann 5,0,1,2,3 ausgegeben hat (den fehler macht er jetzt aber auch nichtmehr)
Wahrscheinlich war i an der Stelle im Speicher wo

Code: Alles auswählen

values[6].value1
oder

Code: Alles auswählen

calues[6].value2
hätte liegen müssen, hättest du das Array richtig initialisiert. Da du das aber nicht gemacht hast, hast du Speicher dein i überschrieben, mit 0. Deswegen hat er dann 0 ausgegeben und dann bei 0 weiter hochgezählt.
Damit hättest du eine Endlosschleife gebaut, die immer bis 5 hochzählt und sich dann selber zurücksetzt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Xaver2k
Beiträge: 5
Registriert: Mo Dez 23, 2013 1:42 pm

Re: C Anfänger - Xcode Problem mit Speicher??

Beitrag von Xaver2k » Mo Dez 23, 2013 3:51 pm

aha ok das leuchtet ein.
ist das überhaupt der richtige weg alle werte der struktur im array zu nullen?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C Anfänger - Xcode Problem mit Speicher??

Beitrag von cloidnerux » Mo Dez 23, 2013 7:07 pm

ist das überhaupt der richtige weg alle werte der struktur im array zu nullen?
Er ist nicht falsch, man kann es aber einfacher machen.
Zum einen ist zu überlegen, ob du nicht an anderer Stelle deinen structs Werte zuweist, das Nullen also überflüssig ist.
Du kannst aber auch mit "memset" einen ganzen Speicherbereich auf einen bestimmten Wert setzten:

Code: Alles auswählen

memset(values, 0, sizeof(values)*ARRAY_LENGTH);
Aber auch dabei spielst du mit Pointer rum, daher muss die Konstante ARRAY_LENGTH auch der tatsächlichen Anzahl der Elemente in deinem Array entsprechen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C Anfänger - Xcode Problem mit Speicher??

Beitrag von nufan » Mo Dez 23, 2013 10:27 pm

Wenn du die Initialisierung direkt beim Anlegen des Arrays aus Strukturen vornehmen willst, kannst du das auch so machen:

Code: Alles auswählen

#include <stdio.h>

#define SIZE 5

struct DummyStruct
{
  int a;
  char b;
};

int main()
{
  struct DummyStruct s[SIZE] = { { 0 } };

  int i;
  for( i = 0; i < SIZE; i++ )
    printf( "%d: %d %d\n", i, s[i].a, s[i].b );

  return 0;
}
Als Ausgabe bekommst du:

Code: Alles auswählen

0: 0 0
1: 0 0
2: 0 0
3: 0 0
4: 0 0
Lässt du die Zuweisung weg, wirst du irgendwelche "zufälligen" Werte rausbekommen, eben was grad an dieser Stelle im Speicher steht.

Antworten