ダブルポインタがうまく動作しない

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

ダブルポインタがうまく動作しない

#1

投稿記事 by nao » 18年前

ご教授お願いしますm(__)m

目的:main関数に空ポインタを作り、それを関数へ引数としてそのアドレスを渡す。
   渡されたポインタに5つのポインタ変数を連番でつくり、そこのポインタ変数に構造体の先頭アドレスを
   入れる。
   アドレスをいれられて戻ってきたmain関数でその構造体の中身を出したり書き換えたりしたい。

というものなのですが、main関数に帰ってきた後、そのデータをいざ使おうとしても中身はぐちゃぐちゃに
なっておりうまくいきません。
何がおかしいかご教授願います。

typedef struct {
int x,y,xx,yy;
} AA;


void sub(AA **a)
{
int i;
*a = (AA *) malloc(sizeof(AA*) * 5);
for (i = 0; i < 5; i++) {
a = (AA*) malloc(sizeof(AA));
memset(a,0,sizeof(AA));
}


}

void main(void)
{
AA *a;
sub(&a);
a[3].x = 2;
}

フリオ

Re:ダブルポインタがうまく動作しない

#2

投稿記事 by フリオ » 18年前

 
 ソースは"pre"タグで字下げしてほしい。

 こういうことでしょうか?
#include <stdio.h>
#include <stdlib.h>

typedef struct{
		int x,y,xx,yy;
	} AA;

int sub(AA ***a)
{
	int i;
	
	if(!(*a = (AA **)malloc(sizeof(AA *) * 5))) return 0;
	for (i = 0; i < 5; i ++){
		if(!((*a) = (AA *)malloc(sizeof(AA)))) return 0;
	}
	return 1;
}

void freeAA(AA **a)
{
	int i;
	
	for(i = 0; i < 5; i ++){
		free(a);
	}
	free(a);
	return;
}

int main(void)
{
	AA **a;
	
	if(!sub(&a)) return 1;
	a[3]->x = 2;
	a[3]->y = 3;
	a[3]->xx = 4;
	a[3]->yy = 5;
	printf("%d %d %d %d\n", a[3]->x, a[3]->y, a[3]->xx, a[3]->yy);
	freeAA(a);
	return 0;
}

nao

Re:ダブルポインタがうまく動作しない

#3

投稿記事 by nao » 18年前

なるほど…
(*a)とすることにより解決したんですね(´д`;
ありがとうございましたm(__)m

フリオ

Re:ダブルポインタがうまく動作しない

#4

投稿記事 by フリオ » 18年前

 
> (*a)とすることにより解決したんですね

 違うんだけど・・・
 

閉鎖

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