単方向リスト構造について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
CupSL
記事: 2
登録日時: 9年前

単方向リスト構造について

#1

投稿記事 by CupSL » 9年前

C言語を用いて、単方向リスト構造を構築しております。
開発環境はVS2013Desktopです
ポインタ変数自体のアドレスを関数に引数として渡し、関数内でメモリ領域を確保。
構造体変数headを基準にして順番に検索を行い、処理を行っていきます。
Errorで、引数に渡す変数searchとappendの初期化がされていません。と出ます。
アドレスを引数として渡し、そのアドレスからmalloc関数で指定した領域分メモリ領域を確保するのが目的です。
ポインタへの理解が深まっていない故、メモリイメージ図を展開して思慮致しましたが、未だ正答に辿り着けないままです。
ご法度を侵しているいる可能性もあります。ご教授願います。

コード:

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

typedef struct _list_t{
	int x;
	int y;
	_list_t *link;
}list_t;

list_t head = { 0, 0, NULL };

void LinkListStructure(list_t *append, list_t *search);
void Update();
void DeleteListStructure();

int main()
{
	list_t *append;	//リスト追加用
	list_t *search;	//リスト検索用

	//append、searchポインタ変数のアドレスを渡す
	LinkListStructure(&(*append), &(*search));       //←この行でエラー★-----------
	//更新、削除
	Update();
	return;
	
}

void LinkListStructure(list_t *append, list_t *search)
{
	//メモリ確保
	if ((append = (list_t *)malloc(sizeof(list_t))) == NULL){
		MessageBox(NULL, "追加リストメモリ確保失敗!!", "ErrorType:Memory", MB_OK);
		exit(EXIT_FAILURE);
	}
	//linkにNULL格納
	append->link = NULL;
	//先頭アドレスのセット
	search = &head;
	//linkポインタがNULLのデータになるまで検索
	while (search->link != NULL){
		search = search->link;
	}
	//データを繋げる
	search->link = append;
}

void Update()
{
	list_t *search;

	search = head.link;
	while (search != NULL){
		if (/*条件*/){
			/*処理*/
		}
		search = search->link;
	}

	DeleteListStructure();
}

void DeleteListStructure()
{
	list_t *search, *save;

	search = save = head.link;
	while (search != NULL){
		if (/* 条件 */){
			save->link = search->link;
			free(search);
			search = save;
		}
		save = search;
		search = search->link;
	}
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 単方向リスト構造について

#2

投稿記事 by h2so5 » 9年前

ポインタ変数自体のアドレスは &append, &search です。

CupSL
記事: 2
登録日時: 9年前

Re: 単方向リスト構造について

#3

投稿記事 by CupSL » 9年前

h2so5 さんが書きました:ポインタ変数自体のアドレスは &append, &search です。
返信有難うございます h2so5 様
仰るとおりでした。
ポインタ変数自体のアドレスを渡したい場合というのは、ダブルポインタを用いて
例として

コード:

struct list_t *append,*search
struct list_t **append_p = &append,**search_p = &search;

LinkListStructure(append_p,search_p);
とするしかないのでしょうか?

ポインタ変数のアドレスを引数として渡して、渡したアドレスからmallocで指定したbyte分のメモリをヒープ領域に確保したいのですが
Run-Time Check Failure #3 - The variable 'search' is being used without being initialized.(原文そのまま)
というエラー(ランタイムエラー#3:変数searchは初期化されていないのにも関わらず使用されている)が出るのは
一体なぜなのでしょうか?

box
記事: 2002
登録日時: 13年前

Re: 単方向リスト構造について

#4

投稿記事 by box » 9年前

最初の質問への回答にあったとおり、
CupSL さんが書きました:

コード:

	//append、searchポインタ変数のアドレスを渡す
	LinkListStructure(&(*append), &(*search));       //←この行でエラー★-----------
ここを

コード:

	//append、searchポインタ変数のアドレスを渡す
	LinkListStructure(&append, &search);
にした上で、LinkListStructure関数の中身も適切に手を加えてください。

# ポインター変数に対して*演算子、&演算子の順に適用すると、結局何もしてないってことです。
# 今回の場合だと、ポインター変数を適切に初期化していないから中身はゴミ。つまりどこを指しているか
# わからないってことです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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