C - Хранение указателя на целое число - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть любой массив типа int, и мне нужно хранить в этом массиве указатель на другую часть массива.

Проблема в том, что в 64-битных системах размер указателя составляет 8 байтов, а размер целого - 4 байта, вызывая предупреждения компилятора (например, предупреждение, приведенное к указателю из целого числа другого размера)

Я (думаю0, я понимаю, почему стонет компилятор, очевидно, что попытка уместить 8 байтов в 4 байта - не очень умная идея. Проблема в том, что массив предоставляется мне как есть, и я должен использовать только массив для хранения .

Ответы [ 4 ]

6 голосов
/ 17 ноября 2010

Если вы ссылаетесь на один и тот же массив, почему бы вам не сохранить только индекс?

#include <limits>
#include <boost/static_assert.hpp>

int array[ARRAY_DIMENSION];

/**
 * the following line will cause an error at compile-time if size_t
 * is not enough to index the array.
 */

BOOST_STATIC_ASSERT(std::numeric_limits<size_t>::max() >= ARRAY_DIMENSION);

int access_array(size_t index)
{
    size_t intended_index = array[index];
    return array[intended_index];
}
4 голосов
/ 17 ноября 2010

Боюсь, это невозможно. Как вы правильно поняли, вы не можете вписать 64-битное значение в 32-битное. Для этого вам нужно будет предоставить массив intptr_t .

2 голосов
/ 17 ноября 2010

Не храните указатели в int с.Хранить указатели в переменных указателя.Если вам действительно нужно это сделать, рассмотрите возможность использования массива союзов.

0 голосов
/ 17 ноября 2010

Используйте структуру.

struct myint
{
    int array[10];
    int *next;
};
...