C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

引数 配列をポインタで /しー (18/11/01(Thu) 20:33) #89142
Re[1]: 引数 配列をポインタで /Jitta (18/11/01(Thu) 23:03) #89144
  └ Re[2]: 引数 配列をポインタで /しー (18/11/01(Thu) 23:21) #89145
    ├ Re[3]: 引数 配列をポインタで /774RR (18/11/02(Fri) 08:28) #89146
    └ Re[3]: 引数 配列をポインタで /にゃるら (18/11/02(Fri) 09:28) #89149


親記事 / ▼[ 89144 ]
■89142 / 親階層)  引数 配列をポインタで
□投稿者/ しー (1回)-(2018/11/01(Thu) 20:33:53)

分類:[C/C++] 

以下のプログラム、
a.output(hoge)の部分で

0x00C11258 で例外がスローされました (プログラム名.exe 内): 0xC0000005: 場所 0x00D10000 への書き込み中にアクセス違反が発生しました

というエラーが出ます。
どういったことが原因で生じているのでしょうか?

また解決方法はどのようになりますか?

=======================

class A{
public: void output(char *hoge){
cout << hoge;
}
}

int main(){
char hoge[10];
cout<<"10文字入力";
cin>>hoge;
A a;
a.output(hoge);
}
[ □ Tree ] 返信 編集キー/

▲[ 89142 ] / ▼[ 89145 ]
■89144 / 1階層)  Re[1]: 引数 配列をポインタで
□投稿者/ Jitta (421回)-(2018/11/01(Thu) 23:03:25)
No89142 (しー さん) に返信
> 以下のプログラム、
> a.output(hoge)の部分で
> 
> 0x00C11258 で例外がスローされました (プログラム名.exe 内): 0xC0000005: 場所 0x00D10000 への書き込み中にアクセス違反が発生しました
> 
> というエラーが出ます。
> どういったことが原因で生じているのでしょうか?
> 
> また解決方法はどのようになりますか?
> 
> =======================
> 
> class A{
>  public: void output(char *hoge){
>   cout << hoge;
>  }
> }
> 
> int main(){
>  char hoge[10];
>  cout<<"10文字入力";
>  cin>>hoge;
>  A a;
>  a.output(hoge);
> }


「10文字入力」で、10文字入力したんですか?
10文字って、どういう文字を入れました?

char hoge[10] ですが、「10って書いたから10文字」ではありません。
これは「10個分の容器を用意した」で、容器の1つを「終端子」に使います。よって、実際に使えるのは9個分です。
また、「文字」って、何を入れました?
あるいは、char hoge[10] は、「10文字分」ではありません。「文字10個分(内1つは終端子)」でもありません。
「10バイト分(内1バイトは終端子)」です。
1文字を表現するためには、1バイト以上を使います。
よって、2バイト以上使う文字を含んでいれば、10バイト分の領域をオーバーしてしまいます。

解決方法は、あなたの開発環境に依存します。

[ 親 89142 / □ Tree ] 返信 編集キー/

▲[ 89144 ] / ▼[ 89146 ] ▼[ 89149 ]
■89145 / 2階層)  Re[2]: 引数 配列をポインタで
□投稿者/ しー (2回)-(2018/11/01(Thu) 23:21:36)
No89144 (Jitta さん) に返信

回答ありがとうございます。

実装した実際のプログラムは1024個分の配列を用意しています。
そこに30文字を数字で入れたりする程度なので余裕で余ると思うのですが、デバッグの時に12345と入力してみても、今回のようなエラーが出てしまっています。
私の考えが間違っているのでしょうか?

理想としては、hoge[0]=1、hoge[1]=2、…という風にしたいと思っています。


エラーが出ているポイントは
> a.output(hoge);
であって配列に値を入れるところでは出ていないので、今回指摘された箇所に原因があるとは思えないのですが…。


エラーの部分は、配列を引数としてポインタで渡すという部分にあると思ったのですが違うのでしょうか?
[ 親 89142 / □ Tree ] 返信 編集キー/

▲[ 89145 ] / 返信無し
■89146 / 3階層)  Re[3]: 引数 配列をポインタで
□投稿者/ 774RR (640回)-(2018/11/02(Fri) 08:28:14)
オイラが見た範囲、オーバーランさせない(文字をたくさん入力しない)限り動くはずなので
提示コードはあなたの実験しているコードと一致してないと思う。

[ 親 89142 / □ Tree ] 返信 編集キー/

▲[ 89145 ] / 返信無し
■89149 / 3階層)  Re[3]: 引数 配列をポインタで
□投稿者/ にゃるら (43回)-(2018/11/02(Fri) 09:28:57)
No89146 (774RR さん) に返信
774RRさんに同意。

No89145 (しー さん) に返信
> エラーが出ているポイントは
>>a.output(hoge);
> であって配列に値を入れるところでは出ていないので、今回指摘された箇所に原因があるとは思えないのですが…。

ではエラーになったときは何がhogeに入っているのでしょう。
デバッグ実行してみませんか?

デバッグ実行できないなら

int len; // hogeのバイト数を入れてください
for (int i = 0; i < len; i++)
{
count << "hoge[" << i << "]" << hoge[i];
}

みたいなコードで確認してみてはいかがでしょうか?


[ 親 89142 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -