質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

4235閲覧

C++で二次配列をmemcpyしたい

nicoyou

総合スコア129

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/08/28 11:50

生配列はmemcpyするときに配列名と2次配列の合計サイズを渡せば一括でコピーできますが、下のように動的に確保したものだと
エラーが出てしまいました

&を付けたり*を付けたりいろいろ試してみた結果forで200回 data_[ix] を渡してサイズをsizeof(data_t)*100にすることでコピーすることには成功しました
しかし、memcpyを呼ぶたびにデータサイズを保存するようにしているためあまりたくさん呼びたくありません
生配列のように一括でコピーする方法はありませんか?
調べても同じことを書いているサイトは見つけられませんでした

C++

1data_t** data_; 2 data_ = new data_t*[200]; 3 for (int ix = 0; ix < 200; ix++) 4 { 5 data_[ix] = new data_t[100]; 6 } 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

無理です。

2次元配列を一度のmemcpyでコピーできるのはコピー元が一つのアドレスを起点にsizeof(data_t)100200のサイズ分、連続したメモリに配置されているからです。
今回のようなコードだとdata_[0],data_[1]...のさすアドレスは非連続です。
アドレスが非連続であれば個別にmemcpyするしかありません。

投稿2019/08/28 12:21

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2019/08/28 12:51

お二方回答ありがとうございます 分かりやすかったのでnomuken様をBAに選ばさせていただきますm(__)m
guest

0

こんにちは。

他の方も回答されているようにmemcpyを使ってコピーはできません。
しかし、クラスにまとめてしまえば、代入できるようになります。
固定長ならstd::array、可変長ならstd::vectorを使えます。

std::arrayの例:

C++

1#include <iostream> 2#include <iomanip> 3#include <array> 4 5struct data_t 6{ 7 int data; 8 data_t() : data(0) { } 9}; 10 11typedef std::array<std::array<data_t, 10>, 20> Array2d20x10; 12 13int main() 14{ 15 Array2d20x10 aArray2d; 16 17 // 設定 18 int i=0; 19 for (auto& row : aArray2d) 20 { 21 for (data_t& elem : row) 22 { 23 elem.data = i++; 24 } 25 } 26 27 // 代入 28 Array2d20x10 aArray2d2 = aArray2d; 29 30 // 内容確認 31 for (auto& row : aArray2d2) 32 { 33 for (data_t& elem : row) 34 { 35 std::cout << std::setw(3) << elem.data << " "; 36 } 37 std::cout << "\n"; 38 } 39}

wandbox

投稿2019/08/28 12:36

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

個々のnewしたものについてはアドレスの連続性はないので、一括では無理ですね
200回まわして、個々の要素ごとにコピーするしかないです

投稿2019/08/28 12:20

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問