- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
来自 Linux 编程接口(interface)
execl(prog, arg, (char *) 0);
execl(prog, arg, (char *) NULL);Casting
NULL
in the manner of the last call above is generally required, even on implementations whereNULL
is defined as(void *) 0
.This is because, although the C standards require that null pointers of different types should test true for comparisons on equality, they don’t require that pointers of different types have the same internal representation (although on most implementations they do).
And, in a variadic function, the compiler can’t cast(void *) 0
to a null pointer of the appropriate type.The C standards make one exception to the rule that pointers of different types need not have the same representation: pointers of the types
char *
andvoid *
are required to have the same internal representation. This means that passing(void *) 0
instead of(char *) 0
would not be a problem in the example case ofexecl()
, but, in the general case, a cast is needed.
“通常需要按照上面最后一次调用的方式转换NULL
”
C 标准是否要求将空指针表示为与 (char*) 0
相同?
“在诸如 execl()
的可变参数函数中,编译器无法将 (void *) 0
转换为适当类型的空指针”
(void *) 0
不是一个类型的空指针吗?
如果是,为什么编译器不能将 execl(prog, arg, (void*) 0)
中的 (void *) 0
转换为“空指针”合适的类型”?
“char *
和 void *
类型的指针必须具有相同的内部表示。这意味着传递 (void *) 0
而不是 (char *) 0
在 execl()
的例子中不会有问题。
编译器现在可以将 execl(prog, arg, (void*) 0)
中的 (void *) 0
转换为“适当类型的空指针”吗?
为什么它与我的第 2 点中的引用相矛盾?
如果我将 execl(prog, arg, (void*) 0)
中的 (void *) 0
替换为 0 到任何类型指针的转换,例如(int *) 0
,编译器可以在execl(prog, arg, (int*) 0)
中转换(int *) 0
> 到“适当类型的空指针”?谢谢。
对于非可变函数调用,例如在 sigaction(SIGINT, &sa, (int*) 0)
中,编译器是否可以转换 (int *) 0
到“适当类型的空指针”?
谢谢。
最佳答案
首先,编译器在任何情况下都不会“转换”。强制转换是源代码中请求转换的语法结构。
我假设当您谈论“编译器转换”时,您指的是隐式转换,即一种类型的值可以转换为另一种类型的值的过程,没有施法者。
该标准明确规定了可以应用隐式转换的上下文;必须始终有一个目标类型。例如在代码 int x = Y;
中,表达式 Y
可以是某种不是 int
的类型,但隐式转换为int
定义。
没有隐式转换应用于对应于原型(prototype)的 ...
部分的函数参数,default argument promotions 除外.对于指针值,默认参数提升保持不变。
你的问题的一个共同点似乎是编译器应该以某种方式假装 execl
的行为就好像最后一个参数有一个原型(prototype)一样。但实际上并没有,编译器对特定的函数也没有任何神奇的行为。你传递的就是你得到的。
标准指定表达式(char *)0
的值为空指针。它没有提到空指针的表示,并且可能有多种不同的表示都是空指针。
execl
函数规范指出参数列表应该以 (char *)0
结束,它是 char *< 类型的值
。 void *
类型的值不是 char *
类型的值,如上所述,在此上下文中没有隐式转换。
仍然没有隐式转换;您引用的文字是说您可以在这种特定情况下使用错误的类型参数(没有原型(prototype)参数;并且 char *
预期但 void *
提供,反之亦然).
那将是未定义的行为,您在第 3 点中引用的文本不适用于 int *
。
sigaction
函数有一个原型(prototype);有问题的参数是 struct sigaction *oldact
。当您尝试使用不同类型的值初始化原型(prototype)参数(或任何变量)时,将尝试隐式转换为参数类型。存在从任何空指针值到不同类型的空指针值的隐式转换。此规则在 C11 6.3.2.3/4 中。这样代码就OK了。
关于编译器能否将 `(void *) 0` 中的 `execl(prog, arg, (void*) 0)` 转换为适当类型的空指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52195275/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我是一名优秀的程序员,十分优秀!