# Zugriffsverletzung/falscher Code?



## Quwerfeldein (20. November 2010)

Hallo, ich habe versucht ein Programm zu schreiben, inwelchem der Benutzer Zahlen eingeben kann (die in einem Array gespeichert werden), dann eingibt, von welcher Arrayposition aus die Zaheln aufsummiert, und, wieviele Arraypositionen aufsummiert werden sollen.

1. Problem: "Nachdem der Benutzer die "0te" Zahl eingibt stürzt das Programm mit der Meldung "Unbehandelte Ausnahme bei 0x68054ada (msvcr80d.dll) in Summenbrechnung.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc." ab. Ist etwas an dem Code oder etwas grundlegendes falsch?

2. Sache: Bei  "int meinezahlen[1000]" habe ich die 1000 in die Klammern gesetzt. Eigentlich wollte ich, das dort die Zahl steht, die der Benutzer für "Zahlanzahl" auserkoren hat. Aber wenn ich "Zahlanzahl" oder ähnliches in die eckigen Klammern setze kommt eine Fehlermeldung... wie mache ich das korrekt?


```
#include <stdio.h>
#include "stdafx.h"
int summe_rek(int zahlen[], int start, int anzahl) {
  if (anzahl == 0) return 0; 
  return zahlen[start] + summe_rek(zahlen, start + 1, anzahl - 1);
}  

int main() {
  int Zahlanzahl;
  printf("Wieviele Zahlen möchten sie eingeben?\n");
  scanf_s("%i", &Zahlanzahl);
  int meinezahlen[1000];
  int i;
  for (i = 0; i <= Zahlanzahl; i++) {
	  printf("%i te Zahl:\n", i);
	  scanf("%i", meinezahlen[i]);
  }
  int start,anzahl;
  printf("Ab welcher Zahl möchten sie aufsummieren?\n");
  scanf_s("%i", &start);
  printf("Wie viele Zahlen möchten sie aufsummieren?\n");
  scanf_s("%i", &anzahl);
  printf("Summe: %i\n", summe_rek(meinezahlen, start, anzahl));
  getchar();
  getchar();
  return 0;
}
```

Ich benutze Visual Studio 2005.;c++


----------



## RudolfG (20. November 2010)

Quwerfeldein hat gesagt.:


> 1. Problem: "Nachdem der Benutzer die "0te" Zahl eingibt stürzt das Programm mit der Meldung "Unbehandelte Ausnahme bei 0x68054ada (msvcr80d.dll) in Summenbrechnung.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc." ab. Ist etwas an dem Code oder etwas grundlegendes falsch?
> 
> 
> ```
> ...



Hi Quwerfeldein,

der Grund für den Speicherzugriffsfehler liegt in der fehlerhaften Bedingung der for-Schleife. Wenn man bei 0 anfängt und bei 1000 aufhört zu zählen sind es 1001 Elemente, dein Array hat aber nur 1000 Elemente.

Du versuchst also auf das 1001 Element zugreifen und das gibt es nicht.

richtig währe es wie folgt:


```
...
for (int i = 0; i < Zahlanzahl; i++)
...
```
 



Quwerfeldein hat gesagt.:


> 2. Sache: Bei  "int meinezahlen[1000]" habe ich die 1000 in die Klammern gesetzt. Eigentlich wollte ich, das dort die Zahl steht, die der Benutzer für "Zahlanzahl" auserkoren hat. Aber wenn ich "Zahlanzahl" oder ähnliches in die eckigen Klammern setze kommt eine Fehlermeldung... wie mache ich das korrekt?



Wie man das zur Laufzeit angeben kann, findest du hier unter "Zur Laufzeit erzeugte Arrays".

Viel Erfolg

Gruß
RudolfG


----------



## Quwerfeldein (20. November 2010)

Danke für die schnelle Antwort. Die selbe Fehlermeldung tritt jedoch trotz Änderung noch auf.


----------



## RudolfG (20. November 2010)

Quwerfeldein hat gesagt.:


> Danke für die schnelle Antwort. Die selbe Fehlermeldung tritt jedoch trotz Änderung noch auf.



Tritt der Fehler immer auf  (also unabhängig ob du 1, 3 oder 100030 eingibst)?

Nenn mal die Zahl du da zum testen eingibst.

Gruß
RudolfG


----------



## Trulleberg (21. November 2010)

Es muss heissen:

```
scanf("%i", &meinezahlen[i]);
```
Warum benutzt du mal scanf_s und scanf?
scanf_s ist kein Standard, weder C noch C++.


----------



## Quwerfeldein (21. November 2010)

Anzahl der Zahlen: 1
0te Zahl: 0
Unbehandelte Ausnahme bei 0x68004ada

Anzahl der Zahlen: 1
0te Zahl: 1
Unbehandelte Ausnahme bei 0x67f94ada

Anzahl der Zahlen: 1
0te Zahl: 11111
Unbehandelte Ausnahme bei 0x68004ada

Anzahl der Zahlen: 5
0te Zahl: 0
Unbehandelte Ausnahme bei 0x67ed4ada

Anzahl der Zahlen: 5
0te Zahl: 0
Unbehandelte Ausnahme bei 0x67f94ada

@Trullenberg Jetzt klappt es! Machmal sagter mir dass an manchen Stellen scanf unsicher sei... und bei scanf_s ist wieder alles in Ordnung. Würde auch gern wissen was es damit auf sich hat...

danke!


----------



## badday (21. November 2010)

Siehe http://msdn.microsoft.com/de-de/library/w40768et(VS.80).aspx für den Unterschied.

Gruß,

badday


----------

