0

構造内の変数の内容を変更したい場合は、次のように、別の関数を使用して構造を変更し、構造へのポインターを指定する必要があると言うのは正しいですか。

構造:

typedef struct data{
    int row;
    int column; 
}data;

構造体チェンジャー関数の var:

struct data* init_maze(void) {

    data information;      //init information struct
    data *infoPoint;       //int information struct pointer

    int row = 6;
    int column = 10;

    infoPoint->row = row;   //not working but should be updating information
    infoPoint->column = column; //same as above

    return infoPoint;
}

しかし、これは意図したとおりに機能していません。コードが壊れ、何も起こりません。誰かが私が間違っていることを説明してください。

4

4 に答える 4

0

まず、ここで何を達成したいのかを自問してください。

たとえば、「データ情報」を宣言し、それを使用することはありません。操作する前に、「infoPoint」を何かに向けることさえしません。「SEGFAULT」について何も書いていないので、コードを省略していると思いますか?

ともかく。新しい「データ」構造体を作成し、それをいくつかの初期値で返しますか? 次に、次のいずれかを行う必要があります: A) メモリを割り当て、ヒープ上のこのメモリ部分へのポインタを返します (これは malloc (または同様のもの) で割り当て、ある時点で free で割り当てを解除する必要があります)"

B) パラメータとして構造体データへのポインタを取り、そこに値を入れることができます。

data *init_maza(void) {
   data *infoPoint = malloc(sizeof(struct data));

   data->row = 6;
   data->column = 10;

   return data;
}

void init_maze(data *outp) {
   outp->row = 6;
   data->column = 10;
}

スタックまたはヒープ上の構造体データへのポインターを使用して B) を呼び出すことができます。

データ foo; data *bar = malloc(sizeof(struct data));

// 初期化 init_maze(&foo); init_maze(バー);

「address-of」演算子であるアンパサンド「&」に注意してください。

ポインター パラメーターへのポインターを使用することもできるため、エラー コードなど、他の何かを返すこともできます。非常に頻繁に使用されます:

int init_maze(data **d) {
    *data = malloc(sizeof(struct data));
    (*data)->row = 6;
    (*data)->column = 10;

    return 0;
}
于 2013-02-23T17:43:22.710 に答える
0

サンプル コードは、初期化されていない構造体へのポインターを変更しようとしているため、初期化されていないためinfoPoint->row = row;無効な操作infoPointです。

次のように init 関数を変更できます。

void init_maze(data *infoPoint) {
    infoPoint->row = 6;
    infoPoint->column = 10;
}

次に、次のように使用します。

int main()
{
    data information;
    init_maze(&information);
}

data information;スタックに構造体を割り当て、init_mazeその仕事をするためにポインタを渡すことができます。

于 2013-02-23T17:44:33.340 に答える
0

別の回答では、ポインターを適切に使用することがカバーされていますが、別のアプローチでは、単純な変数と同じように構造体を渡すことができるため、このバージョンを検討してください。

struct data init_maze(void) {

    data information;   
    information.row = 6;   
    information.column = 10;

    return information;
}

これはポインタを渡すほど効率的ではありませんが、ほとんどの実用的な目的とほとんどの場合、違いは関係ありません。ここで、この構造体のサイズは 2 つの整数であり、このカテゴリに確実に分類されます。

于 2013-02-23T17:51:45.653 に答える
0

infoPoint は次のように宣言する必要があります。

data* infoPoint = malloc (sizeof(data));

次に、このコードが機能するはずです:

infoPoint->row = row;   //not working but should be updating information
infoPoint->column = column; //same as above



また、関数 init_maze には構造体のプレフィックスは必要ありません。

data* init_maze(void) 


data information;  

も未使用です

于 2013-02-23T17:32:46.237 に答える