【问题标题】:use const char array in snprintf in c在 c 的 snprintf 中使用 const char 数组
【发布时间】:2026-02-05 15:10:01
【问题描述】:

我是 C 的新手。我有这种类型的代码,当我尝试执行它时,显示此警告消息“传递 'snprintf' 的参数 1 从指针目标类型中丢弃 'const' 限定符”和什么也没发生。

我做错了什么? 谢谢

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

int main()
{
  int i;
  const char *msg[3] = {"Hello", "Good Morning", "Hello World"};
  const char *strings[];


  for(i=0; i<3; i++)
  snprintf(strings[i], 20, "%s %d", msg[i], i);

  for(i=0; i<3; i++)
  printf("strings[%d]: %s\n", i, strings[i]);

  return 0;
}

【问题讨论】:

    标签: c arrays char printf constants


    【解决方案1】:

    你需要为每个要打印的字符串分配空间,像这样

    char *strings[3];
    for (i = 0; i < 3 ; ++i) {
        size_t length = snprintf(NULL, 0, "%s %d", msg[i], i);
        strings[i] = malloc(length + 1);
        if (string[i] != NULL) {
            snprintf(strings[i], length, "%s %d", msg[i], i);
        }
    }
    
    for (i = 0; i < 3 ; ++i) {
        if (string[i] != NULL) {
            printf("string[%d]: %s\n", i, strings[i]);
        }
    }
    

    在第一部分中,我们在堆栈上分配了 3 个指针。然后,对于每个字符串,我们首先计算长度,然后将snprintf() 放入成功分配的内存中。

    【讨论】:

    • 您不必动态分配空间。只要您可以预测(限制)您需要多少空间,自动数组就可以正常工作。 (只要您不需要数据的生命周期比自动数组提供的更长。)
    • @Adam,不要忘记为每个 malloc() 拨打 1 free()
    • @IharobAlAsimi,我还没有很好的 C 知识。 “不要忘记为每个 malloc() 调用 1 个 free()”是什么意思?你能告诉我吗?
    • malloc() 以某种方式分配内存,您有责任将其释放回操作系统。不调用free() 将导致所有这些内存一直为您的程序分配,直到您的程序退出,所以当您不再需要它时,您必须free() 它。在 google 上搜索free() 函数。
    【解决方案2】:

    snprintf(strings[i], 20, "%s %d", msg[i], i);

    试图写入strings[i]。由于它被声明为常量,编译器只是拒绝这样做,因为它违反了合同。

    但在这里,情况更加严重:strings[i] 没有为字符串甚至指针 (!) 分配任何内存,因此删除 const 限定符会导致运行程序时出现未定义的行为。

    【讨论】: