2016-04-13 4 views
1

Hallo, ich bin eine Funktion bauen array mit Zeigern auf c mit Visual Studio 2015 zu drucken. während ich die Funktion diese senden mir diese Massage: Run-Time Check Failure # 2 - Der Stapel um die Variable 'arr' wurde beschädigt.die Funktion beschädigte mein Array in C

dies die Funktion:

void arrprint(int* arr, int size)//printing numbers: 
{ 

    size = (int)arr + size*sizeof(int);// the last adress of the array 
    int* firstAdress = arr; 
    for (arr=firstAdress; arr < size; arr++) 
    { 
     printf("%2d", *arr); //printing 
    } 
    *arr = firstAdress; //for not destroy the array 
    printf("\n"); 
} 

Dank für Helfer

+0

Warten Sie, warum werfen Sie einen Zeiger auf 'int' auf ein' int', um 'size' zu ​​berechnen? – ForceBru

Antwort

2

Diese Linie

*arr = firstAdress; //for not destroy the array 

das Array zerstört. Sie schreiben in den Speicher, wenn Sie dereferenzieren.


Da in C, alles von Wert übergeben wird, müssen Sie über die Korruption keine Sorge, wenn Sie arr in der Funktion ändern. Also brauchen Sie nicht .

void arrprint(int* arr, int size)//printing numbers: 
{ 

    int* lastAddress = arr + size; 
    int* firstAdress = arr; 
    for (arr=firstAdress; arr < size; arr++) 
    { 
     printf("%2d", *arr); //printing 
    } 
    printf("\n"); 
} 

Nach der Aktualisierung sollte der Code wie folgt aussehen. Sie sollten bemerken, dass arr, das hier geändert wird, nur in dieser Funktion geändert wird und der tatsächliche Array-Zeiger (in der Aufruferfunktion) intakt und sicher ist.

+0

... und wenn 'arr' dort dereferenziert wird, zeigt es dank der for-Schleife auf den Ort * nach * dem Array. – Siguza

0

Sie versuchen, size als int * zu verwenden. Verwenden Sie stattdessen eine tatsächliche int *.

Mit der Einstellung *arr = firstAddress schreiben Sie die Adresse des Arrays in das erste Element im Array. Da arr eine lokale Variable ist, haben Änderungen daran keine Auswirkungen auf die Variable in der aufrufenden Funktion.

void arrprint(int* arr, int size)//printing numbers: 
{ 

    int *lastAddress = arr + size; 
    int *firstAdress = arr; 
    for (arr=firstAdress; arr < lastAddress; arr++) 
    { 
     printf("%2d", *arr); //printing 
    } 
    printf("\n"); 
} 
0

persönlich denke, die beste Lösung ist:

void arrprint(int* arr, int size)//printing numbers: 
{ 
    int *lastAddress = arr + size  
    int *firstAddress = arr; 
    for (firstAddress = arr; firstaddress < lastAddress; firstaddress++) 
    { 
     printf("%2d", *firstAddress); //printing 
    } 
    printf("\n"); 
} 

Grund Sie nicht den ursprünglichen Zeiger ändern. Sie können const int * arr auch in der Funktionsdeklaration verwenden, dann erhalten Sie einen Compilerfehler, wenn Sie den Zeiger dereferenzieren.

Verwandte Themen