如何解决空指针的目的是什么?
为什么需要空指针,只要可以将任何指针类型转换为任何指针类型,即:
char b = 5;
int*a = (int*)&b;//both upcasting
或
int b = 10;
char*a = (char*)b;//and downcasting are allowed
?
另外,为什么在使用 malloc/calloc/realloc 时不需要强制转换?
解决方法
可以将任何指针类型转换为任何指针类型
不完全是。 void *
被定义为将任何对象指针1 转换为 void *
并返回一个等效值。它不需要任何演员。
在不太常见的架构中,其他一些指针的大小和范围可能小于 void *
。其他指针类型之间的转换可能会丢失必要的信息。
void *
提供了一个通用的对象指针类型。
void *p = any_object_pointer; // No casts required
any_object_pointer = p; // No casts required
char *
可以代替 void *
,但与其他对象指针的转换需要强制转换。
OP 的 char b = 5; int*a = (int*)&b;
存在未定义行为的风险,因为 int *
的对齐需求可能超过 char *
。
1函数指针可能比void*
更宽。 void *
和其他指针是对象指针。 C 缺乏真正通用的指针类型。
void
指针对于创建通用 API 非常有用。您可能会想到 qsort
函数,它可用于对任何类型的数组进行排序。如果 API 不知道指针的具体类型,则可以使用 void
指针。
void qsort(
void *base,size_t number,size_t width,int (__cdecl *compare )(const void *,const void *)
);
关于分配函数,是一样的。 C 运行时不知道有效对象的类型。但这不是问题,因为用户可以使用通用指针 void
。
所以 void
指针被认为是泛型指针,对于多态非常有用,这就是为什么 C 语言将强制转换为 void
是可选的。
“为什么需要空指针,只要可以转换任何指针类型”。
alloc 函数将不得不使用诸如 char 之类的公分母。但是,如果必须投射到我们真正需要的任何东西上,那将是令人困惑的。 “void”仅表示“一堆字节”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。