こんにちは私はVisual Studio 2015でポインタ を使って配列を出力しています。 私はこのマッサージを送信する関数を実行しています: ランタイムチェック失敗#2 - 変数 'arr'の周りのスタックが壊れていました。関数がC言語の配列を壊した
この機能:ヘルパー
こんにちは私はVisual Studio 2015でポインタ を使って配列を出力しています。 私はこのマッサージを送信する関数を実行しています: ランタイムチェック失敗#2 - 変数 'arr'の周りのスタックが壊れていました。関数がC言語の配列を壊した
この機能:ヘルパー
ため
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
は、この関数でのみ変更されており、実際の配列ポインタ(呼び出し元関数内)は完全で安全です。
... 'arr'がそこで逆参照されるとき、forループのおかげで、*配列の後ろの*場所を指します。 – Siguza
size
をint *
として使用しようとしています。代わりに実際に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");
}
は個人的に最善の解決策だと思います。また、関数宣言でconst int * arrを使用することもできます。ポインタを間接参照すると、コンパイラエラーが発生します。
待って、なぜ 'int'へのポインタを' int'に 'size'を計算するためにキャストしていますか? – ForceBru