#include<stdio.h>
int main()
{
const char arr[10] = "hello";
printf(arr);
return 0;
}
编译上述代码时不给出任何警告。但是当我删除
const
来自 const char arr[10]
它会发出类似 format not a string literal and no format argument
的警告。为什么我会变成这样? const
关键字有何不同?这里我使用gcc编译器。
printf
函数需要 const char *
作为其第一个参数。
如果传入一个
const char
数组,该数组 decays 为指向其第一个元素的指针,并且该指针的类型为 const char *
,这正是函数所期望的。
如果您传入的数组不是
const
,那么它会衰减为 char *
,与函数期望的不匹配,因此您会收到警告。
请注意,将非字符串常量的内容作为第一个参数传递给
printf
是一种不好的做法。此参数是一个格式字符串,指示如何处理任何其他参数。如果第一个参数不是字符串常量而是用户可以控制的参数,则可以传递格式说明符,该格式说明符将处理比传递的参数更多的参数。这可以允许读取不打算读取的内存或写入不打算写入的内存,并且被认为是一个安全漏洞。