You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中未用const限定符时printf打印字符串为何触发警告?

问题背景

以下代码使用gcc -Wformat -Wformat-security编译时无警告:

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

但移除const char arr[10]中的const后,编译会触发如下警告:

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

GCC的-Wformat-security警告核心是防范格式化字符串漏洞:如果传给printf的第一个参数是可修改的字符串,存在被注入%n这类危险格式化符、进而篡改内存的风险。

当你给数组加上const后,编译器会判定arr是只读的常量字符串——它的内容在程序运行全程不会被修改,完全不存在被恶意篡改的可能,所以编译器认为这个调用是安全的,不会触发警告。

而去掉const后,arr变成了可修改的字符数组,编译器无法确保它的内容始终安全(比如后续代码可能修改数组内容,或者数组数据来自不可信输入),因此会触发警告,提示你改用更安全的写法,比如printf("%s", arr);。

简单说,const在这里就是给编译器递了个“这个字符串不会变,绝对安全”的信号,让编译器跳过安全警告。

内容的提问来源于stack exchange,提问作者Baranitharan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:49:58