相关疑难解决方法(0)

NULL,'\ 0'和0之间有什么区别

在C中,似乎有零各个值之间的差- NULL,NUL0.

我知道ASCII字符的'0'计算结果为480x30.

NULL指针通常定义为:

#define NULL 0
Run Code Online (Sandbox Code Playgroud)

要么

#define NULL (void *)0
Run Code Online (Sandbox Code Playgroud)

另外,也有似乎评价的NUL人物.'\0'0

是否有时候这三个值不相等?

这在64位系统上也是如此吗?

c null pointers

287
推荐指数
6
解决办法
28万
查看次数

((void*)0)是否为空指针常量?

我正在阅读这篇博客文章,在Null指针常量和括号表达式部分下,作者参考了ISO C标准中的第6.3.2.3节和第6.5.1节,并说:

没有说括号空指针常量是一个空指针常量.

严格来说,这意味着,这(void*)0是一个空指针常量,但((void*)0)不是.

然后:

我敢肯定,大多数C实现根本治疗括号空指针常数作为空指针常数,并定义NULL无论是作为0,((void*)0)或以其他的方式.

两个参考部分说:

§6.3.2.3

值为0的整型常量表达式或类型为void*的表达式称为空指针常量.

§6.5.1

带括号的表达式是主表达式.它的类型和值与未表示的表达式相同.如果未表示的表达式分别是左值,函数指示符或空表达式,则它是左值,函数指示符或void表达式.

粗体句是否与提交人声称((void*)0)不是空指针常量相矛盾?

c language-lawyer

35
推荐指数
2
解决办法
3万
查看次数

(int*)0是否为空指针?

这可以被认为是这个问题的扩展(我只对C感兴趣,但添加C++来完成扩展)

6.3.2.3.3中的C11标准说:

值为0的整型常量表达式或此类表达式转换为类型void *称为空指针常量.

我个人对此的看法是0并且(void *)0表示空指针,其整数值实际上可能不是0,但是不包括0强制转换为任何其他类型.

但是,标准然后继续:

如果将空指针常量转换为指针类型,则生成的指针称为空指针,...

它包含(int *)0为空指针,因为强制转换是一种显式转换(C11,6.3),它在转换方法下列出.

然而,令我惊讶的是以下短语

...或者这样的表达式转换为void *...

有了上面的语义,这句话​​似乎完全没用.问题是,这句话完全没用吗?如果没有,它有什么影响?因此,是否(int *)0为空指针?


另一个可以帮助讨论的问题如下.被(long long)123视为"123转换为long long",或"123与类型long long".换句话说,有没有转换(long long)123?如果没有,则上面的第二个引用包括(int *)0为空指针.

c null-pointer language-lawyer

18
推荐指数
2
解决办法
8331
查看次数

vararg函数如何找出机器码中的参数数量?

printf这样的可变函数如何找出它们得到的参数数量?

显然,参数的数量不会作为(隐藏)参数传递(请参阅asm示例中的printf调用).

有什么诀窍?

assembly printf variadic abi calling-convention

11
推荐指数
4
解决办法
5285
查看次数