相关疑难解决方法(0)

使用`NULL`指针转换说明符`p`的行为是什么?

我想知道是否:

void *ptr = NULL;
printf("%p\n", ptr);
Run Code Online (Sandbox Code Playgroud)

会不会给出(nil)输出?

它是依赖于标准库实现,还是C99标准规范?

c null printf

12
推荐指数
2
解决办法
5394
查看次数

关于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
查看次数

gcc/clang如何假设字符串常量的地址是32位?

如果我编译这个程序:

#include <stdio.h>

int main(int argc, char** argv) {
    printf("hello world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于x86-64,asm输出使用movl $.LC0, %edi/ call puts.(请参阅godbolt上的完整asm输出/编译选项.)

我的问题是:GCC如何知道字符串的地址可以适合32位立即数操作数?为什么不需要使用movabs $.LC0, %rdi(即a mov r64, imm64,不是零或符号扩展imm32).

AFAIK,没有任何迹象表明加载器必须决定在任何特定地址加载数据部分.如果字符串存储在上面的某个地址,1ULL << 32那么movl将忽略更高的位.我对clang有类似的行为,所以我不认为这是GCC独有的.


我关心的原因是我想创建自己的数据段,它存在于我选择的任意地址(可能超过2 ^ 32)的内存中.

c linux linker x86-64 elf

5
推荐指数
1
解决办法
303
查看次数

将NULL传递给printf%s

#include<stdio.h>
#include<string.h>

int main() {
    char *ptr = NULL;

    printf("%s", ptr);//The output is null
    //  printf("%s\n", ptr); //addition of **\n** give segmentation fault 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一个printf输出:(null).但为什么第二个printf产出是: Segmentation fault (core dumped)只是添加:\n

c

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

printf 在分配空字符串时返回 6 而不是 0

为什么函数在将其作为字符串printf分配给它时返回 6 而不是 0 ,尽管它什么也没打印?NULL

int main(void)
{
    int x;
    x = printf("%s", NULL);
    printf ("\n%d", x);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

(null)
6
Run Code Online (Sandbox Code Playgroud)

c printf null-string

0
推荐指数
1
解决办法
93
查看次数

标签 统计

c ×5

printf ×3

abi ×1

elf ×1

linker ×1

linux ×1

null ×1

null-string ×1

variadic-functions ×1

x86-64 ×1