Структура для назначения двумерных структурных указателей в C - PullRequest
1 голос
/ 24 декабря 2010

Я хочу получить этот код, и я гуглил и спросил в efnet и freenode, но я не нашел ответа.

Я хочу назначить структуру woot другой двумерной структуреwoot *, и мне нужно malloc, чтобы сделать это.

Тогда, как я могу использовать malloc там и как назначить структуру?Спасибо.

#include <stdio.h>
struct omg {
    int foo;
};
struct woot {
    struct omg *localfoo;
    int foo;
};
int a = sizeof(struct woot);
int main(void){
    struct woot *what[10][10] = (struct woot *) malloc(100*a);
    struct omg hahaha[100];
    hahaha[1].foo = 15;
    what[1][6].localfoo = &hahaha[1];
}

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Вы пытаетесь инициализировать массив скалярным значением (указатель возвращается функцией malloc). Если вы действительно хотите, чтобы матрица указателей 10 на 10 указывала на структуры (а не матрица 10 на 10 структур), вам не нужен malloc:

//Statically allocated 10x10 matrix of pointers, no need for malloc.
struct woot *what[10][10];

Чтобы назначить указатель на ячейку в этой матрице:

struct woot oneSpecificWoot;
what[1][2] = &oneSpecificWoot;

Если это действительно, действительно то, что вы хотите, вы можете динамически создать кучу вутов и заполнить их. Примерно так:

int i, j;
for(i=0; i<10; i++) {
    for(j=0; j<10; j++) {
        what[i][j] = malloc(sizeof(struct woot));
        //Of course, you should always test the return value of malloc to make sure
        // it's not NULL.
    }
 }

Но если вы собираетесь это сделать, вы можете просто статически распределить сами woot:

//A 10x10 matrix of woots, no malloc required.
struct woot what[10][10];

Первый случай (двумерный массив указателей) был бы более вероятен, если woots создаются где-то в другом месте, и вы просто хотите, чтобы ссылки на них располагались в сетке или, возможно, если вы не знаете Размеры сетки во время компиляции. Но в вашем коде вы используете malloc для создания их фиксированного числа, так что вы можете просто сделать так, чтобы компилятор назначил их статически.

0 голосов
/ 24 декабря 2010
struct woot *what[10][10] = (struct woot *) malloc(100*a);

Мне любопытно, этот код даже компилируется?( edit: нет, это не так.) В любом случае:

  1. Вам действительно не нужен malloc (), декларации struct woot *what[10][10]; должно быть достаточно.
  2. Типовое указание возвращенного указателя void * при вызове malloc () не требуется в C (и считается плохой формой).

(Не совсем ответ, язнаете ... я бы опубликовал его как простой комментарий, но у меня пока недостаточно очков.)

edit: Упс, другие указали на то же самое, когда я писал этоpost.

new edit: Вот лучшая версия вашего кода, с некоторыми исправленными ошибками:

#include <stdio.h>
#include <stdlib.h> // needed for malloc()

struct omg {
    int foo;
};

struct woot {
    struct omg *localfoo;
    int foo;
};

int main(void){
    const int a = sizeof(struct woot); /* there is no reason "a" should be global...
                                          actually, "a" is not needed at all, and, even if it
                                          were needed, it should be declared as "const" :) */
    struct woot *what[10][10];
    struct omg hahaha[100];
    hahaha[1].foo = 15;
    what[1][6]->localfoo = &hahaha[1];
    what[7][2] = malloc(a); // I would write "malloc(sizeof(struct woot))"

    return 0;   // main() should return an int, as declared!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...