普通に考えると
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:22