打印字符串时,为什么在 c 中未使用常量限定符时收到警告?

问题描述 投票:0回答:1
#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编译器。

c string printf
1个回答
0
投票

printf
函数需要
const char *
作为其第一个参数。

如果传入一个

const char
数组,该数组 decays 为指向其第一个元素的指针,并且该指针的类型为
const char *
,这正是函数所期望的。

如果您传入的数组不是

const
,那么它会衰减为
char *
,与函数期望的不匹配,因此您会收到警告。

请注意,将非字符串常量的内容作为第一个参数传递给

printf
是一种不好的做法。此参数是一个格式字符串,指示如何处理任何其他参数。如果第一个参数不是字符串常量而是用户可以控制的参数,则可以传递格式说明符,该格式说明符将处理比传递的参数更多的参数。这可以允许读取不打算读取的内存或写入不打算写入的内存,并且被认为是一个安全漏洞。

© www.soinside.com 2019 - 2024. All rights reserved.