動的にメモリ確保した構造体配列のポインタ渡し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
T.K.

動的にメモリ確保した構造体配列のポインタ渡し

#1

投稿記事 by T.K. » 16年前

こんばんはT.K.といいます。
VC++を利用しています。

質問したい内容はタイトルのとおり、
動的にメモリ確保した構造体配列のポインタ渡し
のやり方です。

普通に考えると、
#include <stdlib.h>
#include <malloc.h>

struct Str
{
	int i;
};

void f(/*?????*/)
{
	a[1]->i = 1;
}

int main()
{
	Str* a;
	a = static_cast<Str*>(calloc(3, sizeof Str));
	a[1].i = 0;
	f(&a);

	return 0;
}
といった形になったのですが、これでは定義文の引数を
どのように宣言すべきかわかりません。

どのように書けばポインタを渡せるのでしょうか。
ご教授お願いします。

御津凪

Re:動的にメモリ確保した構造体配列のポインタ渡し

#2

投稿記事 by 御津凪 » 16年前

関数 f の引数には Str* a と定義し、
f(a);
として呼び出します。


T.K.

Re:動的にメモリ確保した構造体配列のポインタ渡し

#4

投稿記事 by T.K. » 16年前

返信ありがとうございます。

確かに自分も最初は
void f( Str** a )
でよいかなと思い、記述していたのですが、
これでは関数f内の代入でアクセス違反が起きます。
(最初に書いておくべきでした。すみません)

理由はおそらく、通常のダブルポインタと
メモリを動的に確保した配列のポインタは、形式こそ
似ていますが、指している場所が微妙にずれているからだと思います。

何か新しい型でも用意すれば解決するかなと思ったのですが、
C++でメモリの大きさを変えたまったく新しい型を用意する方法
を知らないために断念しました。

たかぎ

Re:動的にメモリ確保した構造体配列のポインタ渡し

#5

投稿記事 by たかぎ » 16年前

もしかして、
void f(Str (*a)[3]);
を期待しているのでしょうか?
それであれば、呼び出し側は、
Str (*a)[3];
a = static_cast<Str(*)[3]>(calloc(3, sizeof Str));
とする必要があります。

ただ、こんなことをするより、素直に、
std::vector<Str> a(3, Str());
とした方がよいと思います。

box

Re:動的にメモリ確保した構造体配列のポインタ渡し

#6

投稿記事 by box » 16年前

> これでは関数f内の代入でアクセス違反が起きます。

ポインターへのポインターを使うようにf()のコードを
書くこともできます。

T.K.

Re:動的にメモリ確保した構造体配列のポインタ渡し

#7

投稿記事 by T.K. » 16年前

返信ありがとうございます。
それから、こちらの返信が大変遅れました。ごめんなさい。

実現したかったことはvectorを使用することでとてもきれいに
解決できました。たかぎさんありがとうございました。

>>boxさん
ポインタのポインタを使う方法は、よくわかりませんでした。
もしよければ何かヒントをいただけますか?

box

Re:動的にメモリ確保した構造体配列のポインタ渡し

#8

投稿記事 by box » 16年前

Cの例です。適当にアレンジしてください。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int i;
} Str;

void f(Str **a)
{
	a[0][1].i = -789;
	(*a)[2].i = 890;
}

int main(void)
{
	Str *a;
	
	a = (Str *) malloc(sizeof(Str) * 3);
	if (!a) exit(1);
	
	a[1].i = 123;
	a[2].i = 456;
	
	printf("【変更前】\n");
	printf("a[1].i=%d\n", a[1].i);
	printf("a[2].i=%d\n", a[2].i);
	
	f(&a);
	
	printf("【変更後】\n");
	printf("a[1].i=%d\n", a[1].i);
	printf("a[2].i=%d\n", a[2].i);
	
	free(a);
	return 0;
}

T.K.

Re:動的にメモリ確保した構造体配列のポインタ渡し

#9

投稿記事 by T.K. » 16年前

>>boxさん

理解しました。
丁寧な返信ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る