Проще говоря, нет. Не гарантируемый на всей архитектуре.
Мой вопрос: почему? Если Вы хотите выделить тип, достаточно большой для хранения void*
, лучшая вещь выделить (удивительно достаточно :-) void*
. Почему там потребность соответствовать ему в int
?
РЕДАКТИРОВАНИЕ: На основе Ваших комментариев к Вашему дублирующемуся вопросу Вы хотите сохранить специальные значения указателя (1,2,3) для указания на дополнительную информацию.
НЕТ!! Не делайте этого!! . Нет никакой гарантии, которые 1, 2 и 3 не совершенно допустимые указатели. Это может иметь место в системах, где Вы обязаны выравнивать указатели на 4-байтовых границах, но, так как Вы спросили обо всей архитектуре, я предполагаю, что у Вас есть мобильность как высокое значение.
Находят другой способ сделать это, это корректно. Например, используйте объединение (синтаксис из памяти, может быть неправильным):
typedef struct {
int isPointer;
union {
int intVal;
void *ptrVal;
}
} myType;
Затем можно использовать isPointer 'булевскую переменную', чтобы решить, необходимо ли рассматривать объединение как целое число или указатель.
РЕДАКТИРОВАНИЕ:
, Если скорость выполнения имеет главное значение, то решением для определения типа является способ пойти. В основном необходимо будет определить целое число, которое Вы хотите для каждой платформы, на которой Вы хотите работать. Можно сделать это с условной компиляцией. Я также добавил бы в проверке на этапе выполнения, чтобы гарантировать, что Вы скомпилировали для каждой платформы правильно таким образом (я определяю ее в источнике, но Вы передали бы это как флаг компилятора, как" cc -DPTRINT_INT
"):
#include <stdio.h>
#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;
}
В моей системе (Ubuntu 8.04, 32-разрядная), я добираюсь:
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
В этом случае, я знал бы, что должен был скомпилировать с PTRINT_INT (или долго). Может быть способ поймать это во время компиляции с #if, но я не мог быть побеспокоен, исследовав его в данный момент. При нанесении удара платформы, где нет никакого целого типа, достаточного для содержания указателя, Вам не повезло.
Имеют в виду, что использование специальных значений указателя (1,2,3) для представления целых чисел не может также работать над всеми платформами - это может на самом деле быть действительными адресами памяти для указателей.
однако, если Вы собираетесь проигнорировать мой совет, нет очень, я могу сделать для остановки Вас. Это - Ваш код, в конце концов, :-). Одна возможность состоит в том, чтобы проверить все Ваши возвращаемые значения от malloc и, если Вы добираетесь 1, 2 или 3, просто malloc снова (т.е. имейте mymalloc (), который делает это автоматически). Это будет незначительной утечкой памяти, но она не гарантирует столкновений между Вашими специальными указателями и реальными указателями.
Не существует официальной распространяемой версии для v3.5. Я сам искал один, но отказался.
Единственная возможность состоит в том, что какой-нибудь знающий человек определил, где веб-установщик загрузил файлы, собрал их в красивый пакет и куда-то загрузил.
] Конечно, если Google не сможет дать вам ответ на этот пакет, маловероятно, что вы его найдете.
Если вы загрузите полный пакет клиента и откроете его с помощью вашего любимого программного обеспечения для сжатия (WinZIP, WinRAR, 7-zip, IZArc, ...), вы должны иметь возможность извлечь несколько установочных файлов с именами:
DotNetFx20Client_Package_x86.exe (14 MiB)
DotNetFx30Client_Package_x86.exe (8 MiB)
DotNetFx35Client_Package_x86.exe (<1MiB)
Похоже, что они являются накопительным установщиком 3 версии клиентского каркаса.
Но я понятия не имею, можно ли распространять эти пакеты напрямую, без полного пакета.