【发布时间】:2012-06-18 22:39:22
【问题描述】:
我试图理解 C 中的 void 指针类型转换。我编写了一个程序来尝试创建分段错误,但我没有得到它。谁能解释一下原因
代码:
#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 是合法的,因为所有其他人都指的是一些未初始化的随机内存,应该会导致段错误
【问题讨论】:
-
当您访问受保护的内存时,您通常会遇到段错误。您正在访问的内存可能会或可能不会受到保护(可能不会,因为通常变量是按顺序分配的,但它们根本不必如此)。
-
你很不幸第一个
printf()没有崩溃;您的ptr必须恰好包含一个足够有效的指针值以不崩溃,尽管它是形式上未定义的行为(未定义的行为包括“似乎工作”)。
标签: c void-pointers