Язык C: почему я получаю NULL? - PullRequest
0 голосов
/ 24 августа 2011

о коде:

tp - указатель на определенную структуру, которая содержит таблицу.

таблица - указатель на указатель другой структуры, используемой в качестве массива.

size - это просто размер таблицы.

Я отправляю эти проверяемые функции в функцию для инициализации всех ячеек в массиве

в NULL.

эта строка:

initArr(tp->table,tp->size);

отправляет их в эту функцию:

 void initArr(ObjectP* array,int size)
 {
    int i;
    for (i = 0; i < size; ++i)
    {
        array[i]=NULL;
    }
 }

с помощью отладчика eclipse я могу видеть, что объекты в массиве являются infact

инициализируется значением NULL, но когда метод заканчивается,

tp-> table имеет значение NULL.

указатели стали дикими?

помогите, пожалуйста.

структуры:

таблица:

  typedef struct Table
    {
        size_t size;
        hashFcn hash;
        printFcn print;
        comparisonFcn comp;
        ObjectP* table;
        int duplicated;
    }Table;

объект:

    typedef struct Object
    {
         void *key;
         ObjectP pointsTo;
    }Object;

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Массивы и указатели похожи, но различны.

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

При таких обстоятельствах tp-> table точно такой же, как tp-> table [0], но предполагается [0] (потому что он имеет тот же адрес). В системах, которые реализованы таким образом, таблица tp-> указывает адрес, а смещение от этого адреса (чтобы добраться до элемента массива) представляется как значение, умноженное на размер типа данных (или размер одного указателя в вашем случай).

tp->table (the base address 0x00000100)
tp->table[0] (the address 0x00000100 + 0 * sizeof(... pointer ...) = 0x00000100)
tp->table[1] (the address 0x00000100 + 1 * sizeof(... pointer ...) = 0x00000104 (some systems only))
tp->table[2] (the address 0x00000100 + 2 * sizeof(... pointer ...) = 0x00000108 (some systems only))

Таким образом, ваш отладчик может на самом деле печатать tp-> table, что в точности соответствует tp-> table [0], в зависимости от реализации вашего компилятора.

0 голосов
/ 24 августа 2011

Представленный код кажется неправильным (вы возвращаете что-то из функции void!), Но я собираюсь сделать дикое предположение и предположить, что в вашем реальном коде вы пытаетесь установить для «массива» что-то (вероятно, через malloc) внутри initArr, и в этом случае у нас есть классическая ошибка: вы передаете tp-> table значением , поэтому он не изменяется initArr: initArr работает с локальной копией tp-> таблица, которая удаляется, когда initArr заканчивается:)

Edit:

Doh - теперь вы опубликовали обновление, похоже, мое предположение было неверным.: / Представь себе слава, если я правильно понял!:)

...