Я пытался понять приведение типов void в C. Я написал программу, чтобы попытаться создать ошибку сегментации, но я ее не получаю. Может кто-то пожалуйста, объясните мне, почемуvoid pointer typecasting
Код:
#include <stdio.h>
typedef unsigned long U32;
int main()
{
void *obj;
U32 value = 25;
U32* ptr;
printf("*(ptr) : %lu\n", *(ptr));
obj = &value;
ptr = &value;
ptr++;
printf("*(U32 *)(obj) : %lu\n", *(U32 *)(obj));
printf("*((U32 *)(obj) + 1) : %lu\n", *((U32 *)(obj) + 1));
printf("*(U32 *)((U32 *)(obj) + 1) : %lu\n", *(U32 *)((U32 *)(obj) + 1));
printf("*(ptr) : %lu\n", *(ptr));
return 0;
}
Выход:
*(ptr) : 458998657
*(U32 *)(obj) : 25
*((U32 *)(obj) + 1) : 3215085752
*(U32 *)((U32 *)(obj) + 1) : 3215085752
*(ptr) : 3215085752
Как я вижу это только второй Printf является законным, так как все остальные имеют в виду какой-то неинициализированного оперативной памяти и должен вызывать сегрегацию неисправности
В основном вы получаете segfault при доступе к защищенной памяти. Память, к которой вы обращаетесь, может быть или не быть защищена (возможно, нет, поскольку обычно переменные распределяются последовательно, но они не обязательно должны быть вообще). – jn1kk
Вам не повезло, что первый 'printf()' не сбой; ваш 'ptr' должен состоять из достаточно правильного значения указателя, чтобы не сбой, хотя это формально неопределенное поведение (и неопределенное поведение включает« появление для работы »). –