###前提・実現したいこと
配列を返す関数を作りたい。
戻り値に配列の長さ、引数にポインタをもつ関数で配列の値が取得できるようにしたい。
具体的には、ポインタ引数を関数内でnewし、memcpyで値を書き込んだら
関数の外でポインタを参照することで値を参照したい。
このサイトのGetReceive関数を参考にしています。
よろしくお願いいたします。
###発生している問題・エラーメッセージ
配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。 // ご指摘により解決しました
memcpyによりdstに対してnewした領域にsrcの持っていた値がコピーされ、srcをdeleteしたところでdstにはすべての文字がコピーされ保持されると思っていました。
しかし、関数内でsrcをdeleteしたことによってdstから参照する文字の一部が破壊されてしまいます。
srcからコピーした文字をdstからすべて参照する方法は無いでしょうか?
(最初の質問で文章にし忘れていました。申し訳ございません)
###該当のソースコード
c++
1#include <iostream> 2 3using namespace System; 4 5char* m_src; 6 7void IniSrc() 8{ 9 m_src = new char[16]; 10 char temp[16] = { 'W','e','a', 'r', 'e', 't', 'h', 'e', 'D', 'i', 'v', 'i', 's', 'i', 'o', 'n' }; 11 memcpy( m_src, temp, sizeof(temp)); 12} 13// うまく動作しない関数 14//int MemCpyTest(char* dst) ご指摘を受けて修正 15int MemCpyTest(char*& dst) 16{ 17 const int strLen = 16; 18 dst = new char[16]; 19 20 // memcpy(dst, m_src, sizeof(m_src)); ご指摘を受けて修正 21 memcpy(dst, m_src, strLen); 22 23 delete[] m_src; // いわゆる読み捨てのような事を行いたいのでここでm_srcをdeleteしてしまいたい 24 25 return strLen; 26} 27 28int main() 29{ 30 char *str = NULL; 31 32 IniSrc(); 33 int strLen = MemCpyTest(str); // newで確保した領域の先頭アドレスをstrに渡す事に成功しました 34 35 for (int i = 0; i < strLen; ++i) { // 解決 // しかしmemcpyではsrcをdeleteしたことによって値が破壊され 36 std::cout << str[i]; // 解決 // 値の一部が変わってしまいました 37 } 38 39 std::cout << std::endl; 40 41 std::cin; 42 43 delete [] str; // ご指摘を受けて追加 44 45 return 0; 46}
###補足情報(言語/FW/ツール等のバージョンなど)
- Windows7/64bit SP1
- VisualStudio2008
- VC++
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/18 07:23 編集
2018/01/18 07:38
2018/01/18 07:49
2018/01/18 08:01 編集
2018/01/18 08:04
2018/01/18 08:16 編集
2018/01/19 00:07
2018/01/19 00:29