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

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

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

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

Q&A

解決済

2回答

3898閲覧

ダブルポインタについて

usop

総合スコア64

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

0グッド

0クリップ

投稿2018/06/17 06:00

編集2018/06/17 06:14

main関数で生成したダブルポインタ変数を、関数の引数に渡して、動的なサイズの配列を作って、main関数からデータアクセスできるようなプログラムを書きたいのですが、
main関数のprintfのところで、index1個目のデータにはアクセスできるのですが、
その後のindexにアクセスすると、セグメンテーション違反になってしまいます。
どのように、アクセスすれば良いのでしょうか。

C++

1#include <stdio.h> 2#include <malloc.h> 3 4void setData(int** data, int size); 5 6int main(void) { 7 int** data = new int*; 8 setData(data, 10); 9 for (int i=0; i<10; i++) { 10 printf("%d\n", *data[i]); 11 } 12} 13 14void setData(int** data, int size) { 15 *data = (int*)malloc(sizeof(int) * size); 16 for (int i=0; i<size; i++) { 17 (*data)[i] = i+1; 18 } 19}

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

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

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

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

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

guest

回答2

0

普通に考えると

c++

1#include <stdio.h> 2#include <malloc.h> 3 4void setData(int** data, int size); 5 6int main(void) { 7 int* data; // ここと 8 setData(&data, 10); 9 for (int i=0; i<10; i++) { 10 printf("%d\n", data[i]); // ここが違う 11 } 12} 13 14void setData(int** data, int size) { 15 *data = (int*)malloc(sizeof(int) * size); 16 for (int i=0; i<size; i++) { 17 (*data)[i] = i+1; 18 } 19}

もしくは

c++

1#include <stdio.h> 2#include <malloc.h> 3 4void setData(int** data, int size); 5 6int main(void) { 7 int** data = new int*; 8 setData(data, 10); 9 for (int i=0; i<10; i++) { 10 printf("%d\n", (*data)[i]); // こうか 11 printf("%d\n", data[0][i]); // これでもよい 12 } 13} 14 15void setData(int** data, int size) { 16 *data = (int*)malloc(sizeof(int) * size); 17 for (int i=0; i<size; i++) { 18 (*data)[i] = i+1; 19 } 20}

演算子*は演算子[]よりも優先度が低いので後回しにされるので
*data[i]*(data[i])と等価です。


int **data = new int*;の是非
個人的にはなしです。解放がめんどくさいですし、今回の場合には必要性が見えません。
必要な場合でも、可能な限りstd::vectorやstd::arrayでどうにかできないか考えるべきでしょう。

というわけでC++風に

c++

1#include <stdio.h> 2#include <vector> 3 4void setData(std::vector<int> &data, size_t size); 5 6int main(void) { 7 std::vector<int> data; 8 setData(data, 10); 9 for(int& x : data) 10 printf("%d\n", x); 11} 12void setData(std::vector<int> &data, size_t size){ 13 data = std::vector<int>(size); 14 for (size_t i = 0; i < size; i++) 15 data[i] = i + 1; 16}

投稿2018/06/17 07:07

asm

総合スコア15147

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

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

usop

2018/06/17 07:22

>というわけでC++風に のコード 本当にそのとおりだと思います! 仕事で、C言語の関数(setDataの部分。共有用に改変)を使わなければならず、 データの動的読み込み部分を見ると、あれあれ、ダブルポインタだ。あれ、こういうアクセスの仕方でよかったんだっけか。みたいになって笑 個人的には、ポインタに配列がつくと、なんだかよくわからなくなってしまうので、 *(*data+i) = i+1; のほうが、解りやすい気がしてます。
guest

0

自己解決

自己解決しました。
☓ printf("%d\n", *data[i]);
○ printf("%d\n", (*data)[i]);

投稿2018/06/17 06:28

usop

総合スコア64

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問