sizeof (int) == sizeof (void *)?
Проще говоря, нет. Не гарантируется integers для всех архитектур.
У меня pointer вопрос: почему? Если вы хотите c выделить тип, достаточно c большой для хранения void*
, лучше integers всего выделить (как ни странно ptr :-) void*
. Почему необходимо поместить ptr его в int
?
РЕДАКТИРОВАТЬ: основываясь pointers на ваших комментариях к повторяющемуся int вопросу, вы хотите сохранить ptr специальные значения указателя pointers (1,2,3), чтобы указать дополнительную pointers информацию.
НЕТ !! Не делай этого !!. Нет никакой pointer гарантии, что 1, 2 и 3 не integer являются абсолютно действительными ptr указателями. Это может иметь int место в системах, где вам int необходимо выровнять указатели int по 4-байтовым границам, но, поскольку ptr вы спрашивали обо всех архитектурах, я pointers предполагаю, что переносимость integers является высокой ценностью.
Найдите ptr другой правильный способ. Например, используйте pointer объединение (синтаксис по int памяти, может быть неправильным):
typedef struct {
int isPointer;
union {
int intVal;
void *ptrVal;
}
} myType;
Затем integers вы можете использовать логическое pointers значение isPointer, чтобы c решить, следует ли рассматривать c объединение как целое число c или указатель.
РЕДАКТИРОВАТЬ:
Если ptr скорость выполнения имеет pointer первостепенное значение, то integer лучшим решением будет решение integer typedef. По сути, вам нужно integers будет определить целое число c для каждой платформы, на pointers которой вы хотите работать. Вы pointers можете сделать это с помощью c условной компиляции. Я бы pointer также добавил проверку времени integers выполнения, чтобы убедиться, что c вы правильно скомпилировали integers для каждой платформы (я определяю pointer это в исходном коде, но вы c должны передать это как флаг integers компилятора, например "cc -DPTRINT_INT
"):
#include
#define PTRINT_SHORT
#ifdef PTRINT_SHORT
typedef short ptrint;
#endif
#ifdef PTRINT_INT
typedef int ptrint;
#endif
#ifdef PTRINT_LONG
typedef long ptrint;
#endif
#ifdef PTRINT_LONGLONG
typedef long long ptrint;
#endif
int main(void) {
if (sizeof(ptrint) != sizeof(void*)) {
printf ("ERROR: ptrint doesn't match void* for this platform.\n");
printf (" sizeof(void* ) = %d\n", sizeof(void*));
printf (" sizeof(ptrint ) = %d\n", sizeof(ptrint));
printf (" =================\n");
printf (" sizeof(void* ) = %d\n", sizeof(void*));
printf (" sizeof(short ) = %d\n", sizeof(short));
printf (" sizeof(int ) = %d\n", sizeof(int));
printf (" sizeof(long ) = %d\n", sizeof(long));
printf (" sizeof(long long) = %d\n", sizeof(long long));
return 1;
}
/* rest of your code here */
return 0;
}
В pointers моей системе (Ubuntu 8.04, 32-разрядная integer версия) я получаю:
ERROR: ptrint typedef doesn't match void* for this platform.
sizeof(void* ) = 4
sizeof(ptrint ) = 2
=================
sizeof(short ) = 2
sizeof(int ) = 4
sizeof(long ) = 4
sizeof(long long) = 8
В этом c случае я бы знал, что мне integers нужно скомпилировать с PTRINT_INT pointer (или long). Возможно, есть pointers способ поймать это во время int компиляции с помощью #if, но c я не мог утруждать себя исследованием integers этого в данный момент. Если integers вы наткнетесь на платформу, на pointer которой нет целочисленного ptr типа, достаточного для удержания integer указателя, вам не повезло.
Имейте integers в виду, что использование c специальных значений указателя pointers (1,2,3) для представления pointer целых чисел также может работать pointer не на всех платформах - на pointers самом деле это могут быть pointer допустимые адреса памяти ptr для указателей.
Тем не менее, если integers вы собираетесь проигнорировать integer мой совет, я мало что могу pointer сделать, чтобы вас остановить. В ptr конце концов, это ваш код pointer :-). Одна из возможностей pointers - проверить все возвращаемые int вами значения из malloc и, если c вы получите 1, 2 или 3, просто pointer снова malloc (т.е. иметь integer mymalloc(), который делает ptr это автоматически). Это будет pointer небольшая утечка памяти, но ptr это гарантирует отсутствие c конфликтов между вашими специальными c указателями и реальными указателями.
c
integer
pointers
sizeof (int) == sizeof (void *)?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.