C言語関係掲示板

過去ログ

No641 ポインタのポインタを関数間での引渡し

[戻る] [ホームページ]
No.6854

ポインタのポインタを関数間での引渡し
投稿者---あたる(2003/05/28 16:51:44)


ポインタのポインタを関数間で引き渡しているのですが、
引渡し先で、中身の表示や、領域の解放が上手くできて
いません。
渡し方がわるいのでしょうか。

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

main()
{
     char **str = NULL;

     fun_start(str,10);
     fun_disp(str,10);
     fun_end(str,10);
}
int fun_start(char **str,int num)
{
    char **line = NULL;
    char buf[1024];
    int  i;

    line = (char **)malloc(sizeof(char*) * num);

    for(i=0; i<num; i++) {
        memset(buf,'\0',sizeof(buf));
        memset(buf,'a',i+1);

        line[i] = (char *)malloc(1024);
        strcpy(line[i],buf);
    }
    str = line;

}

int fun_disp(char **str,int num)
{
    int i;

    for(i=0 ; i<num ; i++) {
        printf("[%s]\n",str[i]);
    }
}

int fun_end(char **str,int num)
{
    int i;

    for(i=0 ; i<num ; i++) {
        free(str[i]);
    }
    free(str);
}


No.6856

Re:ポインタのポインタを関数間での引渡し
投稿者---TDa(2003/05/28 17:32:30)


全体をよく見ていないけどとりあえず

int fun_start(char **str,int num)を
int fun_start(char ***ppp,int num);
にしてmainでの呼び出しは
fun_start(&str,10);

fun_start()の最後あたり
str = line;は
*ppp = line;

にしたらたぶん最後まで実行してます。
それとプロトタイプ宣言はしておきましょうね。今時のコンパイラなら
警告ぐらい出るはずですが。

No.6869

Re:ポインタのポインタを関数間での引渡し
投稿者---あたる(2003/05/28 20:19:27)


>全体をよく見ていないけどとりあえず
>
>int fun_start(char **str,int num)を
>int fun_start(char ***ppp,int num);
>にしてmainでの呼び出しは
>fun_start(&str,10);
>
>fun_start()の最後あたり
>str = line;は
>*ppp = line;
>
>にしたらたぶん最後まで実行してます。
>それとプロトタイプ宣言はしておきましょうね。今時のコンパイラなら
>警告ぐらい出るはずですが。

mainでの呼び出しでは、
fun_start(&str,10);
呼び出し側では、
int fun_start(char ***ppp,int num);
*ppp = line;
とすると、なぜ上手く動くのでしょうか。
受け側が、ポインタのポインタのポインタになるのは


No.6874

Re:ポインタのポインタを関数間での引渡し
投稿者---YuO(2003/05/28 20:59:30)


>mainでの呼び出しでは、
>fun_start(&str,10);
>呼び出し側では、
>int fun_start(char ***ppp,int num);
>*ppp = line;
>とすると、なぜ上手く動くのでしょうか。
>受け側が、ポインタのポインタのポインタになるのは

「int」の値を変更するときには,
「int」のポインタを渡しますよね?

同様に,
「charのポインタのポインタ」の値を変更したいのですから,
「charのポインタのポインタ」のポインタを渡す必要があるのです。


No.6881

Re:ポインタのポインタを関数間での引渡し
投稿者---TDa(2003/05/28 22:07:29)


こんなサンプルコードを書いてみました。

#include<stdio.h>

void byValInt(int);
void byRefInt(int *);
void byValStr(char *);
void byRefStr(char **);

int main(void)
{
    int x;
    char *str = "初期値";
    
    printf("使用前: %d\n", x = 5);
    byValInt(x);
    printf("値渡し: %d\n", x);
    byRefInt(&x);
    printf("参照渡し: %d\n", x);
    printf("============================================\n");
    printf("使用前: %s\n", str);
    byValStr(str);
    printf("値渡し: %s\n", str);
    byRefStr(&str);
    printf("参照渡し: %s\n", str);
    
	return 0;
}

void byRefInt(int *x) { *x = 10; }
void byValInt(int x) { x = 1111; }

void byValStr(char *s) { s = "ポインタの値渡し"; }
void byRefStr(char **p) { *p = "ポインタの参照渡し"; }