int getNum(void* data)
{
return *(int*)data; // 1
return *(int*)(data & 0xFFFFFFFF); // 2
}
Второй метод не будет даже компиляции; data
- это указатель, и вы не можете применить поразрядное устройство &
к значению указателя. (Я не знаю, почему вы даже хотели бы скрыть значение указателя. Если это было законно, маска ничего не сделала бы в 32-битной системе и, вероятно, уничтожила бы значение указателя в 64-битной системе .)
что касается первых, он должен работать - если data
является действительным указатель, указывающий на выровнены int
объекта.
Если это терпит неудачу во время выполнения с ошибкой сегментации, это, вероятно, означает, что либо data
является недействительным или иным образом не является допустимым указателем (в том случае, если вы не могут делать то, что вы пытаетесь сделать), или он указывает на несогласованный адрес (который не приведет к сбою seg, если вы находитесь в системе x86 или x86_64, не так ли?).
Чтобы узнать, что выглядит указатель, попробуйте добавить следующее:
printf("data = %p\n", data);
к вашей getNum
функции - или проверить значение data
в отладчике.
Если выравнивание является проблемой, то вы можете сделать это:
int result;
memcpy(&result, data, sizeof result);
return result;
Но в этом случае, хранящем значение int
в качестве смещенного адреса является нечетным, что нужно сделать в первую очередь. Это не обязательно неправильно, просто очень странная вещь.
Какова память, что data
указывает на выделение?
Каково содержание данных? И что вы получаете? – frarugi87
Содержимое - это int, а затем флаг, который является одним байтом ... Я получаю ошибку сегментации –
В чем проблема? –