相关疑难解决方法(0)

没有汇编的C/C++函数定义

我一直认为printf()在最后一步中使用内联汇编定义函数.在stdio.h的内部深处埋藏了一些asm代码,它实际上告诉CPU要做什么.例如,在dos中,我记得它是通过首先mov将字符串的开头添加到某个内存位置或寄存器而不是调用intterupt来实现的.

但是,由于Visual Studio的x64版本根本不支持内联汇编程序,因此我想知道在C/C++中根本不会有汇编程序定义的函数.库函数如何printf()在不使用汇编代码的情况下在C/C++中实现?什么实际执行正确的软件中断?谢谢.

c++ inline-assembly

70
推荐指数
5
解决办法
9493
查看次数

使用printf的%s说明符打印NULL的行为是什么?

遇到一个有趣的采访问题:

test 1:
printf("test %s\n", NULL);
printf("test %s\n", NULL);

prints:
test (null)
test (null)

test 2:
printf("%s\n", NULL);
printf("%s\n", NULL);
prints
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

虽然这可能在某些系统上运行良好,但至少我的方法正在抛出一个分段错误.这种行为最好的解释是什么?以上代码在C中.

以下是我的gcc信息:

deep@deep:~$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)

c linux language-lawyer compiler-bug

48
推荐指数
4
解决办法
4万
查看次数

关于printf的法律论据的几个问题("%s",......)

我正在创建一个修改过的printf实现,我不确定这些问题的答案.

  1. 零是否作为空字符串工作?(被printf("%s", 0)允许吗?)

    我猜不是,因为0是一个int.但是这会引发这个问题:

  2. 是否NULL作为空字符串?(被printf("%s", NULL)允许吗?)

    从逻辑上讲,我认为它应该是肯定的,因为它NULL意味着指针; 但是很多实现似乎都有#define NULL 0,所以我觉得在实践中可能没有.哪个是对的?

  3. 指针类型是否必须指向char?(被printf("%s", (void const *)"")允许吗?)

    我的猜测是类型并不重要,但我不确定.

c printf abi variadic-functions

6
推荐指数
1
解决办法
2133
查看次数