C言語関係掲示板

過去ログ

No.373.ポインタのポインタについて

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

ポインタのポインタについて教えて下さい。
投稿者---yukki(2002/08/24 21:59:24)


<pre>
ある構造体の領域をプログラム内で取得するために、以下のようなサンプルを作りました。
この中で、領域を取得した後にその領域に文字列をコピーすると、プログラムが落ちてしまいます。
領域を破壊してしまっているようなのですが、どこを直せばよいのかわかりません。

ご指摘お願い致します。

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

typedef struct
{
char value[256];
} SearchStruct;

void tStrcopy( SearchStruct **pp );
void main( void )
{
SearchStruct *p;

tStrcopy( &p );
printf( "SearchData[0] = %s\n", p[0].value );
printf( "SearchData[1] = %s\n", p[1].value );

free( p );
}

void tStrcopy( SearchStruct **SearchData )
{
*SearchData = ( SearchStruct *)malloc( 4 * sizeof( SearchStruct ) );
if( (SearchStruct *)0 != *SearchData )
{
memset( *SearchData, 0x00, 4 * sizeof( SearchStruct ) );
}
else
{
printf( "領域の取得に失敗しました" );
return;
}

printf( "要素サイズ=%d\n", strlen(SearchData[0]->value) );

sprintf( SearchData[0]->value, "%s", "第一パラメタ" );
strcpy( SearchData[1]->value , "" );
sprintf( SearchData[2]->value, "%s", "第ニパラメタ" );
sprintf( SearchData[3]->value, "%s", "第三パラメタ" );

printf( "SearchData[0] = %s\n", SearchData[0]->value );
printf( "SearchData[1] = %s\n", SearchData[1]->value );
printf( "SearchData[2] = %s\n", SearchData[2]->value );
printf( "SearchData[3] = %s\n", SearchData[3]->value );
}
</pre>

No.2488

Re:ポインタのポインタについて教えて下さい。
投稿者---TDa(2002/08/24 23:48:37)


こんばんは。たぶん意図するコードは次のようになると思います。エラー処理など手抜きなのでそのつもりで。

void tStrcopy( SearchStruct **pp )の引数がSearchStruct**になっているのが間違いの元だと思います。これがSearchStruct*ならポインタが一つ浅くなってすっきりします。p->memberは(*p).memberの構文糖なので
(*SearchData)[0].valueはSearchData[0]->valueとは書けません。

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

typedef struct {
    char value[256];
} SearchStruct;

void tStrcopy(SearchStruct **pp);

int main( void )
{
    SearchStruct *p;

    tStrcopy(&p);
    printf( "SearchData[0] = %s\n", p[0].value );
    printf( "SearchData[1] = %s\n", p[1].value );

    free(p);
    return 0;
}

void tStrcopy( SearchStruct **SearchData )
{
    *SearchData = malloc(4 * sizeof(SearchStruct));
    
    strcpy((*SearchData)[0].value,  "第一パラメタ");
    strcpy((*SearchData)[1].value , "");
    strcpy((*SearchData)[2].value, "第二パラメタ");
    strcpy((*SearchData)[3].value, "第三パラメタ" );

    printf( "SearchData[0] = %s\n", (*SearchData)[0].value );
    printf( "SearchData[1] = %s\n", (*SearchData)[1].value );
    printf( "SearchData[2] = %s\n", (*SearchData)[2].value );
    printf( "SearchData[3] = %s\n", (*SearchData)[3].value );
}




No.2489

Re:ポインタのポインタについて教えて下さい。
投稿者---かずま(2002/08/25 00:37:18)


> p->memberは(*p).memberの構文糖なので
> (*SearchData)[0].valueはSearchData[0]->valueとは書けません。

書くことは出来ます。次の 6つは同じオブジェクトです。
    SearchData[0][0].value
    (*SearchData)[0].value
    (*SearchData[0]).value
    (**SearchData).value
    (*SearchData)->value
    SearchData[0]->value
p[i] は *(p + i) の構文糖なので、p[0] は *p と同じですから。

No.2491

Re:ポインタのポインタについて教えて下さい。
投稿者---TDa(2002/08/25 00:43:40)


>書くことは出来ます。

そうでした。0番目に限っては同じになります。
それが逆に混乱を招いたりしますが。
0番目だけOKで1番目以降おかしくなるときはこの手のバグを疑った方がいいでしょう。