-1

こんにちは皆さん、変数にポインター値を代入できるかどうか考えていましたか? 基本的に、整数値を指すポインターがあり、それを別の変数に割り当てたいと考えています。すなわち:

coursep->node = 1 //coursep is pointer to structure and node is structure variable
int var;
var = coursep->node; //I want variable to be 1

これはできますか?そしてどうやって?このように割り当てようとするとうまくいかないようです。

編集:基本的に、ポインター値から配列または構造体に入れようとしています。

lines = lineCount(courses); //counts how many lines does file have
struct courses course[lines]; // creates array of structures with amount of lines

    for (i = 0; i < lines; i++) {
        struct courses *coursep;
        coursep = course;
        fscanf(co, " %c %d ", &coursep->courseName, &coursep->numberOfNodes);
        course[i].courseName = coursep->courseName;
        course[i].numberOfNodes = coursep->numberOfNodes;
        for (j = 0; j < coursep->numberOfNodes; j++) {
            fscanf(co, " %d", &(coursep->nodes[j]));
            var = *coursep->nodes[j];
            printf("%d\t", var);
        }
        fscanf(co, "\n");
    }

構造:

struct courses{
char courseName;
int numberOfNodes;
int nodes[];
};

ランダムなごみを出力するため、配列に直接入れることはできません。ポインタを使用すると正しい値が表示されるようです(すべてファイルから読み取られます)が、すべてを配列に入れようとすると、ランダムにスローされるようです再びゴミ=/何かアイデアはありますか?

4

4 に答える 4

2

構造体の最後で空の配列メンバーを宣言すると、それは柔軟な配列メンバーになります。

ISO/IEC 9899:TC3、セクション 6.7.2.1 構造体および共用体指定子、制約 16によると

特殊なケースとして、複数の名前付きメンバーを持つ構造体の最後の要素は、不完全な配列型を持つ場合があります。これは柔軟な配列メンバーと呼ばれます. ほとんどの場合、柔軟な配列メンバーは無視されます。特に、構造体のサイズは、柔軟な配列メンバーが省略されている場合と同じですが、省略が意味するよりも多くの末尾のパディングがある場合があります。ただし、. (または ->) 演算子の左側のオペランドが柔軟な配列メンバーを持つ構造体 (へのポインター) であり、右側のオペランドがそのメンバーの名前である場合、そのメンバーが最長の配列 (同じ要素型を持つ) に置き換えられたかのように動作します。 ) アクセスされるオブジェクトよりも構造が大きくなることはありません。配列のオフセットは、置換配列のオフセットと異なる場合でも、柔軟な配列メンバーのオフセットのままです。この配列に要素がない場合、要素が 1 つあるかのように動作しますが、その要素にアクセスしようとしたり、その要素の 1 つ後ろにポインターを生成しようとした場合の動作は未定義です。


あなたの場合、柔軟な配列メンバーを使用する必要はないと思います。の定義をint nodes[]toに変更し、ループ内int* nodesで for にメモリを割り当てることができます。nodesfor

于 2012-12-14T03:08:00.130 に答える
0

nodesメンバー変数を配列ではなくポインタに変更する必要があります。また、配列に割り当てる前に、その配列にメモリを割り当てる必要があります。

struct courses{
  char courseName;
  int numberOfNodes;
  int *nodes;
};

...

course[i].nodes = malloc(sizeof(int) * course[i].numberOfNodes);

(またはそのようなもの)

于 2012-12-14T02:44:34.850 に答える
0

このコードの問題の1つは、coursep常にcourse配列の最初の要素を指していることです。

struct courses course[lines]; 

for (i = 0; i < lines; i++) {
    struct courses *coursep;
    coursep = course;
    /* ... */
}

...これは、その配列内のほとんどすべてがおそらくゴミになることを意味します。

于 2012-12-14T02:52:21.007 に答える
0

これを試して

int *var;
var = &coursep->node;
于 2012-12-14T01:54:24.983 に答える