#include<stdio.h>
int main()
{
  const char arr[10] = "hello";
  printf(arr);
  return 0;
}

When compiling the above code with don't gave any warning. But when I remove the
const from const char arr[10] it gives a warning:

<source>: In function 'main':
<source>:5:10: warning: format not a string literal and no format arguments [-Wformat-security]
    5 |   printf(arr);
      | 

为什么我会变成这样?const个关键词有什么不同?我在这里用gcc -Wformat -Wformat-security ….

推荐答案

但当我从const char arr[10]中go 掉const时,它给出了警告 大概是format not a string literal and no format argument为什么我 变成这样吗

printf() requires您需要提供一个格式字符串,allows您需要提供额外的参数,以匹配格式中出现的任何转换说明符.

一般来说,使用可修改的字符串作为printf格式是有风险的,因为它可能会有意外的转换说明符.这主要是运行时读取数据的问题,你的特定字符串不会有问题,但GCC的警告看起来并不那么深刻. 它只是将一个可修改的字符串视为一种格式,并发出警告.

不会受到GCC警告的更安全的替代方案将包括使用fputs()%:

    fputs(arr, stdout);

...并以适当的格式使用printf():

  printf("%s", arr);

.

const个关键词有什么不同?

显然,GCC并没有为此区分const char数组和字符串文字.这并不是不合理,但它确实让诊断变得有点混乱.

C++相关问答推荐

错误:C中需要参数声明符

为什么写入系统调用打印的字符数不正确?

编译SDL 2时缺少SDL_ttf

为什么C语言允许你使用var =(struct NAME){

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

进程已完成,退出代码为138 Clion

Kdb:仅升级指定的列

从uint8_t*转换为char*可接受

getline()从c中的外部函数传递指针时输出null

如何计算打印二叉搜索树时每行所需的空间?

用C++构建和使用DLL的困惑

使用正则表达式获取字符串中标记的开始和结束

用于计算位数和的递归C函数

C23标准是否向后兼容?

计算SIZE_MAX元素的长数组的大小

发送和接收的消息中的Unix域套接字不匹配

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

在分配内存后使用指针是未定义的行为吗?

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

仅使用其内存地址取消引用 C 中的 struct