変数の有効範囲について

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

変数の有効範囲について

#1

投稿記事 by megane » 9年前

変数の有効範囲とポインタについて教えてください。
以下のように、main関数でポインタを宣言して、他の関数を経由して、値を取得したい場合には
どのようにすればいいのでしょうか?

このプログラムを実行した場合、 point関数で値を表示しようとすれば、menseki関数で定義された値を表示
できますが、その呼び出し元のmain関数では、point関数が終了した時点で領域が消えるので値の表示ができません。
main関数で SQUARE_tをポインタで宣言しなければできるのはわかるのですが、ポインタで宣言した場合の方法が知りたいです。


コード:

#include <stdio.h>

typedef struct
{
	int x;
	int y;
	int h;
	int w;
} SQUARE_t;


void point (SQUARE_t *);
SQUARE_t *menseki ();

int main(void)
{
	SQUARE_t *square;
	point(square);
	
	printf("x[%d]\n",square->x);
	printf("y[%d]\n",square->y);
	printf("h[%d]\n",square->h);
	printf("w[%d]\n",square->w);

return 0;
}


void point(SQUARE_t *square)
{

	square = menseki();
	
}


SQUARE_t *menseki ()
{
static	SQUARE_t square;
	square.x = 0;
	square.x = 1;
	square.x = 2;
	square.x = 3;
	return 	&square; 
}

アバター
kimuchi
記事: 163
登録日時: 10年前
住所: 東京

Re: 変数の有効範囲について

#2

投稿記事 by kimuchi » 9年前

SQUARE_t構造体定義をグローバル化してしまうか、
SQUARE_tサイズのメモリを確保してそのポインタを利用するか、
などはどうでしょう?
後者は試したことがないですが。

アバター
Ciel
記事: 252
登録日時: 10年前

Re: 変数の有効範囲について

#3

投稿記事 by Ciel » 9年前

なにをしたいのかよくわからない関数ですが、
ポインタのポインタを渡せばいいんじゃないですか?

コード:

#include <stdio.h>
 
typedef struct
{
    int x;
    int y;
    int h;
    int w;
} SQUARE_t;
 
 
void point (SQUARE_t **);
SQUARE_t *menseki ();
 
int main(void)
{
    SQUARE_t *square;
    point(&square);
    
    printf("x[%d]\n",square->x);
    printf("y[%d]\n",square->y);
    printf("h[%d]\n",square->h);
    printf("w[%d]\n",square->w);
 
return 0;
}
 
 
void point(SQUARE_t **square)
{
 
    *square = menseki();
    
}
 
 
SQUARE_t *menseki ()
{
static  SQUARE_t square;
    square.x = 0;
    square.x = 1;
    square.x = 2;
    square.x = 3;
    return  &square; 
}
oui C'est la Vie♪

閉鎖

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