みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

実行できません

#include<iostream>
#include<cstring>
using namespace std;

void reverse(char *str,int count=0);

int main(){
char *s1="this is a test.";
reverse(s1);
cout<<s1;

return 0;
}

void reverse(char *str,int count){
int i,j;
char temp;
if(!count)count=strlen(str)-1;

for(i=0,j=count;i<j;i++,j--){
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}

これはあるサンプルプログラムなのですが、visual studio 2008でコンパイルしたらこのように実行ファイルはできるのですが実行できません。

C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C
4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま
せん。/EHsc を指定してください。
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:samplem.exe
samplem.obj

どうしてでしょうか?よろしくお願いします。

投稿日時 - 2008-12-30 02:50:56

QNo.4592481

困ってます

質問者が選んだベストアンサー

>char *s1="this is a test.";
は「文字列リテラル」と呼ばれるものの値をs1の変数に代入しています。
通常この「文字列リテラル」は「変更してはならない領域」とされていて、
変更したときの振る舞いは「未定義」です。
(C言語の規格として決められていないため、どのような振る舞いをするかは
処理系によってことなる。正しく動くかもしれないし、メモリを壊してしま
うかも知れない。)
>reverse
関数の中で、「変更してはならない領域」を変更しているわけです。

とりあえず動くようにしたいのであれば、
>char *s1="this is a test.";

char s1[] = "this is a test.";
とでもすればいいでしょう。

投稿日時 - 2008-12-30 03:12:30

お礼

ありがとうございました。

投稿日時 - 2008-12-31 09:09:25

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)