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

2022-10-25T14:09:12+00:00