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

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

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

Re[2]: std::reverseの使い方


(過去ログ 114 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■67609 / inTopicNo.1)  std::reverseの使い方
  
□投稿者/ OROCHI (3回)-(2013/08/15(Thu) 15:02:06)

分類:[C/C++] 

こんにちは。
現在、以下のようなプログラムを組んでいます
単にrevを使って文字列を逆配置するものなのですが、実行するとなぜかswapの部分で例外処理を吐いて停止します
原因がわかる方いらっしゃいますでしょうか?

環境
windows 8 
Visual C++ 2010

#include "stdafx.h"
#include <iostream>
#include <algorithm>


using namespace std;


char* rev(char* s)
{	
    reverse(s,s+strlen(s));
    return s;
}



int _tmain(int argc, _TCHAR* argv[])
{
	printf("%s",rev("abcd"));	
	system("PAUSE");
	return 0;
}

引用返信 編集キー/
■67610 / inTopicNo.2)  Re[1]: std::reverseの使い方
□投稿者/ Azulean (196回)-(2013/08/15(Thu) 15:20:06)
2013/08/15(Thu) 15:21:46 編集(投稿者)

"abcd" は書き換え不可能なリテラル文字列だからでしょう。
書き換え可能なバッファを用意してから試すべし。

一例
char* p = _strdup("abcd");
printf("%s",rev(p));
free(p);


追記
「なぜか」と書いていますが、デバッガで理由が表示されていますので、ちゃんと読んでください。

「0xC0000005: 場所 0x00045834 に書き込み中にアクセス違反が発生しました。」というような感じで、書き換え不可能なメモリ領域に書き込もうとしたから例外が発生したわけです。
引用返信 編集キー/
■67616 / inTopicNo.3)  Re[2]: std::reverseの使い方
□投稿者/ OROCHI (4回)-(2013/08/16(Fri) 09:53:30)
ありがとうございました
無事解決しました


> 追記
> 「なぜか」と書いていますが、デバッガで理由が表示されていますので、ちゃんと読んでください。
>
> 「0xC0000005: 場所 0x00045834 に書き込み中にアクセス違反が発生しました。」というような感じで、書き換え不可能なメモリ領域に書き込もうとしたから例外が発生したわけです。
質問の仕方に問題があったことをお詫びしします。元の手順では「なぜアクセス違反が発生するのか」という点も疑問でしたのでその点を書かなかったこともお詫びします
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -