2016-04-13 22 views
1

こんにちは私はVisual Studio 2015でポインタ を使って配列を出力しています。 私はこのマッサージを送信する関数を実行しています: ランタイムチェック失敗#2 - 変数 'arr'の周りのスタックが壊れていました。関数がC言語の配列を壊した

この機能:ヘルパー

+0

待って、なぜ 'int'へのポインタを' int'に 'size'を計算するためにキャストしていますか? – ForceBru

答えて

2

ため

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"); 
} 

おかげでこのライン

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

は配列を破壊します。 arrを逆参照すると、あなたはメモリに書き込んでいます。 Cには、すべてが値渡しされるので


、あなたが機能でarrを変更したときに、破損を心配する必要はありません。したがって、firstAdressは必要ありません。

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"); 
} 

更新後、コードは次のようになります。ここで変更されているarrは、この関数でのみ変更されており、実際の配列ポインタ(呼び出し元関数内)は完全で安全です。

+0

... 'arr'がそこで逆参照されるとき、forループのおかげで、*配列の後ろの*場所を指します。 – Siguza

0

sizeint *として使用しようとしています。代わりに実際にint *を使用してください。

また、*arr = firstAddressを設定すると、配列のアドレスの最初のに配列のアドレスが書き込まれます。また、arrはローカル変数であるため、それを変更しても呼び出し元関数の変数には影響しません。あなたは、元のポインタを変更しない

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"); 
} 

理由:

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

は個人的に最善の解決策だと思います。また、関数宣言でconst int * arrを使用することもできます。ポインタを間接参照すると、コンパイラエラーが発生します。

関連する問題