Проверка и сравнение адресов памяти для переменных различного типа - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь сравнить адреса двух переменных в памяти:

chunk_t *old_chunk, *new_chunk;

    if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { }

Вот прототип для chunk_t:

typedef struct chunk_tag {
    struct chunk_tag *next; /* next node in list */
    int size; /* size of node in units, not bytes */
} chunk_t;

Я получаю ошибки компилятора в моем операторе if оmsgstr "lvalue требуется как унарный '&' операнд".

Я подумал, что это потому, что я добавил int old_chunk-> size и chunk_t old_chunk, поэтому я вписываю old_chunk-> size в chunk_t в операторе if, и компилятор сказал мне «преобразование в не-запрошен скалярный тип "

Ответы [ 4 ]

1 голос
/ 05 марта 2012

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

Представьте себе, что вы говорите, "каков адрес значения, получаемого в результате сложения 1 и 2 вместе?" Для этого нет адреса, потому что это вычисленное значение. Вам нужно иметь переменную или вычисленную ячейку памяти, чтобы иметь возможность напрямую манипулировать памятью.

Исходя из того, как выглядит ваш код, вы хотите выполнить проверку адреса без &:

if(old_chunk + 1 + old_chunk->size == new_chunk) { }

Это потому, что обе ваши переменные являются указателями на chunk_t объектов.

Просто убедитесь, что вы знаете, что делаете. Добавление 1 к old_chunk означает поиск на sizeof(chunk_t) байт в памяти позже, чем то, на которое указывает old_chunk. И наоборот, добавление old_chunk->size означает поиск sizeof(chunk_t) * old_chunk->size байтов позже.

0 голосов
/ 05 марта 2012

Одна вещь - это ваше объявление new_chunk. Он объявлен как chunk_t, а old_chunk объявлен как * chunk_t, указатель на chunk_t.

Если вы переписываете свой код как

    chunk_t * old_chunk, *new_chunk;

if((old_chunk + 1 + old_chunk->size) == new_chunk) { 
    printf("some message");
}

Тогда это будет работать. Или хотя бы скомпилировать.

0 голосов
/ 05 марта 2012

Вам не нужно &(old_chunk + 1 + old_chunk->size).Просто old_chunk + 1 + old_chunk->size.Более того, лучше проверить, является ли old_chunk->size >= 0, потому что вы объявили его как int в своей структуре.

PS Это не «прототип».Это определение структуры.

0 голосов
/ 05 марта 2012

Следующее выражение

old_chunk + 1 + old_chunk->size

не является lvalue, поэтому вы не можете получить его адрес с помощью оператора &.Это то, что сказал вам компилятор с первым сообщением об ошибке.

Второе сообщение об ошибке сообщает вам, что вы пытались выполнить недопустимое преобразование типа.Кажется, вы сделали что-то вроде этого:

(chunk_t) old_chunk->size

, что недопустимо, если size имеет примитивный тип.

...