как получить структуру внутри структуры и назначить ее массиву структур - PullRequest
0 голосов
/ 15 февраля 2011

Извините, если это действительно простой вопрос, но я действительно ржавый в Си, и поиск в Google не помог до сих пор. У меня есть функция C, которая принимает массив структур и целое число:

int foo(struct record *records, int n)
{

}

, а также связанный список, в котором каждый узел имеет структуру:

struct rnode
{
    struct record rec;
    struct rnode *next;
}

и запись структуры:

struct record
{
    enum recordtype type;
    union recordvalue
    {
        int intval;
        char strval[19];
    } value;
};

внутри foo (struct record , int ) Я перебираю связанный список и назначаю первые "n" записи struct в массив, например:

int foo(struct record *records, int n)
{
    int count = 0;
    struct rnode *cur = recordlist;
    while(cur != NULL)
    {
        records[count] = cur->rec; //Basically, how do I write this line?
        printf("%d\n", records[count].type); //Both these print the correct values
        printf("%d\n", records[count].value.intval); //Prints correct values
        count++;
    }
}

Я пытался сделать: records [count] = cur-> rec

, который компилируется, но когда я делаю следующее:

struct record *records = malloc(sizeof(struct record)*n);
foo(records, n); //This should populate the array records but it isn't.
//If I print record[0].value.intval here I get 0.

но когда я передаю & записывает [0] в другую функцию, например:

checkrecord(&record[0]);

, где объявлена ​​контрольная запись:

checkrecord(const struct record *r)

внутри этой функции r-> type и r-> value.intval оба возвращают 0 вместо правильного значения.

Я почти уверен, что правильно храню запись struct в массиве, но я не уверен, что еще я делаю неправильно.

Я не хочу показаться упрямым, но проблема в том, что функцию checkrecord () я не могу изменить, но я могу изменить способ передачи параметров ей.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2011

records [count] = cur-> rec правильно, но вы пропустите cur = cur-> next. И запись [1] - это вторая запись, а запись [1] - ее адрес.

0 голосов
/ 17 февраля 2011

Спасибо за вашу помощь всем.Это была проблема памяти в другом месте.Код выше верен.

0 голосов
/ 15 февраля 2011
*(cur->rec)

Это не должно работать, если вы разместили образец.

Правильный способ копирования структуры записи:

records[count] = cur->rec;

Если вы хотите указатель на фактическую структуру в связанном списке, вам нужно иметь массив указателей для записи вместо вашего текущего массива записей. В этом случае вы назначаете с помощью:

records[count] = &(cur->rec);
...