【发布时间】:2019-02-11 04:45:10
【问题描述】:
来自 Linux 编程接口
execl(prog, arg, (char *) 0); execl(prog, arg, (char *) NULL);以上面最后一次调用的方式投射
NULL是 通常需要,甚至在NULL的实现上 定义为(void *) 0。这是因为,尽管 C 标准要求空指针 不同类型的比较应该测试真以进行相等性比较,它们 不要求不同类型的指针具有相同的内部 表示(尽管在大多数实现中它们都这样做)。
而且,在可变参数函数中,编译器不能转换(void *) 0指向适当类型的空指针。C 标准对指针的规则做了一个例外 不同类型的不需要有相同的表示:指针
char *和void *类型必须具有相同的 内部代表。这意味着通过(void *) 0而不是(char *) 0在示例情况下不会有问题execl(),但在一般情况下,需要演员表。
-
“一般需要按照上面最后一次调用的方式投射
NULL”C 标准是否要求空指针与
(char*) 0表示相同? -
“在
execl()等可变参数函数中,编译器无法将(void *) 0强制转换为适当类型的空指针。”(void *) 0不是某个类型的空指针吗?如果是,为什么编译器不能将
execl(prog, arg, (void*) 0)中的(void *) 0转换为“适当类型的空指针”? -
“
char *和void *类型的指针必须具有相同的内部表示。这意味着在execl()的示例情况下传递(void *) 0而不是(char *) 0不会有问题” .编译器现在可以将
execl(prog, arg, (void*) 0)中的(void *) 0转换为“适当类型的空指针”吗?为什么它与我第 2 点中的引用相矛盾?
1234563类型”?
谢谢。
对于非可变函数调用,例如
sigaction(SIGINT, &sa, (int*) 0),编译器能否将(int *) 0转换为“适当类型的空指针”?
谢谢。
【问题讨论】:
-
请注意,C 不是唯一的相关标准:
execl()和sigaction()定义在 POSIX.1-2008 标准中,也称为 IEEE Std 1003.1-2008。考虑添加posix 标签。 -
我相信 POSIX 需要这个才能工作,但我在移动设备上,手头没有引用。
-
惊人的问题!!我在阅读时遇到了同样的问题
标签: c pointers posix null-pointer