質問編集履歴
5
CV++じゃない!
title
CHANGED
File without changes
|
body
CHANGED
@@ -67,4 +67,4 @@
|
|
67
67
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
68
68
|
- Windows7/64bit SP1
|
69
69
|
- VisualStudio2008
|
70
|
-
-
|
70
|
+
- VC++
|
4
コードを変更しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -34,7 +34,8 @@
|
|
34
34
|
const int strLen = 16;
|
35
35
|
dst = new char[16];
|
36
36
|
|
37
|
+
// memcpy(dst, m_src, sizeof(m_src)); ご指摘を受けて修正
|
37
|
-
memcpy(dst, m_src,
|
38
|
+
memcpy(dst, m_src, strLen);
|
38
39
|
|
39
40
|
delete[] m_src; // いわゆる読み捨てのような事を行いたいのでここでm_srcをdeleteしてしまいたい
|
40
41
|
|
@@ -48,8 +49,8 @@
|
|
48
49
|
IniSrc();
|
49
50
|
int strLen = MemCpyTest(str); // newで確保した領域の先頭アドレスをstrに渡す事に成功しました
|
50
51
|
|
51
|
-
for (int i = 0; i < strLen; ++i) { // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
|
52
|
+
for (int i = 0; i < strLen; ++i) { // 解決 // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
|
52
|
-
std::cout << str[i]; // 値の一部が変わってしまいました
|
53
|
+
std::cout << str[i]; // 解決 // 値の一部が変わってしまいました
|
53
54
|
}
|
54
55
|
|
55
56
|
std::cout << std::endl;
|
3
質問に不足があったため修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -8,8 +8,11 @@
|
|
8
8
|
よろしくお願いいたします。
|
9
9
|
###発生している問題・エラーメッセージ
|
10
10
|
|
11
|
-
配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。
|
11
|
+
~~配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。~~ // ご指摘により解決しました
|
12
|
-
|
12
|
+
memcpyによりdstに対してnewした領域にsrcの持っていた値がコピーされ、srcをdeleteしたところでdstにはすべての文字がコピーされ保持されると思っていました。
|
13
|
+
しかし、関数内でsrcをdeleteしたことによってdstから参照する文字の一部が破壊されてしまいます。
|
14
|
+
srcからコピーした文字をdstからすべて参照する方法は無いでしょうか?
|
15
|
+
(最初の質問で文章にし忘れていました。申し訳ございません)
|
13
16
|
###該当のソースコード
|
14
17
|
```c++
|
15
18
|
#include <iostream>
|
@@ -25,7 +28,8 @@
|
|
25
28
|
memcpy( m_src, temp, sizeof(temp));
|
26
29
|
}
|
27
30
|
// うまく動作しない関数
|
31
|
+
//int MemCpyTest(char* dst) ご指摘を受けて修正
|
28
|
-
int MemCpyTest(char* dst)
|
32
|
+
int MemCpyTest(char*& dst)
|
29
33
|
{
|
30
34
|
const int strLen = 16;
|
31
35
|
dst = new char[16];
|
@@ -39,13 +43,13 @@
|
|
39
43
|
|
40
44
|
int main()
|
41
45
|
{
|
42
|
-
char *str = NULL;
|
46
|
+
char *str = NULL;
|
43
47
|
|
44
48
|
IniSrc();
|
45
|
-
int strLen = MemCpyTest(str); //
|
49
|
+
int strLen = MemCpyTest(str); // newで確保した領域の先頭アドレスをstrに渡す事に成功しました
|
46
50
|
|
47
|
-
for (int i = 0; i < strLen; ++i) { //
|
51
|
+
for (int i = 0; i < strLen; ++i) { // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
|
48
|
-
std::cout << str[i]; //
|
52
|
+
std::cout << str[i]; // 値の一部が変わってしまいました
|
49
53
|
}
|
50
54
|
|
51
55
|
std::cout << std::endl;
|
@@ -58,6 +62,7 @@
|
|
58
62
|
}
|
59
63
|
```
|
60
64
|
|
65
|
+
|
61
66
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
62
67
|
- Windows7/64bit SP1
|
63
68
|
- VisualStudio2008
|
2
コード修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
memcpy(dst, m_src, sizeof(m_src));
|
34
34
|
|
35
|
-
delete[] m_src;
|
35
|
+
delete[] m_src; // いわゆる読み捨てのような事を行いたいのでここでm_srcをdeleteしてしまいたい
|
36
36
|
|
37
37
|
return strLen;
|
38
38
|
}
|
@@ -52,6 +52,8 @@
|
|
52
52
|
|
53
53
|
std::cin;
|
54
54
|
|
55
|
+
delete [] str; // ご指摘を受けて追加
|
56
|
+
|
55
57
|
return 0;
|
56
58
|
}
|
57
59
|
```
|
1
メッセージ変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -42,10 +42,10 @@
|
|
42
42
|
char *str = NULL; // ポインタはNULLで初期化するが
|
43
43
|
|
44
44
|
IniSrc();
|
45
|
-
int strLen = MemCpyTest(str); // 関数内でnewしてから値を与えてあるから
|
45
|
+
int strLen = MemCpyTest(str); // ポインタ渡しして関数内でnewしてから値を与えてあるから
|
46
46
|
|
47
|
-
for (int i = 0; i < strLen; ++i) { // 値を参照できると思ってい
|
47
|
+
for (int i = 0; i < strLen; ++i) { // 値を参照できると思っていたのですが
|
48
|
-
std::cout << str[i];
|
48
|
+
std::cout << str[i]; // ポインタの参照先が変わっていないようです
|
49
49
|
}
|
50
50
|
|
51
51
|
std::cout << std::endl;
|