[過去ログ] C++相談室 part134 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
162(5): デフォルトの名無しさん (マクド FF6b-xgEu) [sage] 2018/02/17(土) 09:43:48 ID:Lqib7/b9F(1) AAS
以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。
#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];
std::cout << psz2 << std::endl;
delete psz2;
return 0;
}
167(1): デフォルトの名無しさん (ワッチョイ d793-MfWd) [sage] 2018/02/17(土) 11:25:45 ID:szUqPRvW0(1/2) AAS
>>162
char* psz2 = &(*psz)[0]; って
char* psz2 = psz->c_str(); と同じなのかな?
いずれにせよ delete psz; は出来る(するべき?)だけど、
delete psz2; は出来ないんじゃないかな。
169: デフォルトの名無しさん (ワッチョイ ff8a-NmL4) [sage] 2018/02/17(土) 15:18:23 ID:YAgvIyFy0(1/3) AAS
>>162
お前はstringがただの配列だと思っているのか?
このトンチキ野郎!
170(1): デフォルトの名無しさん (ワッチョイ bf0e-qi38) [sage] 2018/02/17(土) 16:50:38 ID:Q4Uv6cZz0(1/3) AAS
>>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
171(1): デフォルトの名無しさん (ワッチョイ 9fe1-/1mG) [sage] 2018/02/17(土) 17:22:58 ID:0j+aLKWi0(1) AAS
>>162
strdupという手があるが何がしたいのか今一つ分からない
const char* asdf = "asdf";
char *p = strdup(asdf);
std::cout << p << std::endl;
delete p;
182(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-T3WU) [sage] 2018/02/17(土) 18:45:39 ID:uBckbaXI0(1/2) AAS
>>162
ぶっちゃけた話、 strcpy が一番短いと思う。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.056s