【问题标题】:sprintf access violationsprintf 访问冲突
【发布时间】:2008-12-07 20:37:12
【问题描述】:

我对以下代码有疑问:

for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}

它编译得很好,但是当我运行它时,它给了我臭名昭著的“0XC0000005 Access Violation”错误。我尝试将 b 设置为 NULL、“”、“0”、0 和一堆其他东西,但后来我收到“0XC0000005 访问冲突”错误或“表达式:字符串!= NULL。任何帮助将不胜感激!

【问题讨论】:

标签: null char segmentation-fault printf


【解决方案1】:

sprintf 将数据写入现有缓冲区,您将其作为第一个参数传入其中。目前,您根本没有为 b 指定值,这意味着(C 中的 IIRC)该值可以是任何值。如果将其设置为 NULL 或 0,sprintf 将尝试从地址 0 开始写入内存。

您需要创建一个适当大小的缓冲区,以便 sprintf 可以写入其中。例如:

for(i = 0;(i - 1)< n;i++)
{
    char b[10];
    sprintf(b, "%d", i);
}

这是否是实际上你想如何分配缓冲区当然取决于你的真实代码想要对结果做什么。

【讨论】:

    【解决方案2】:

    嗯...您指向 b 的指针包含垃圾,因为您尚未对其进行初始化或分配空间。 Springtf 要求你已经分配了一个目标缓冲区空间...

    至少,您需要类似 char b[50] 或您期望的任何最大大小,而不仅仅是 char*。

    【讨论】:

      【解决方案3】:

      char* 是指向 char 或 char 数组的未初始化指针。需要定义一个缓冲区char[10],否则sprintf的目标地址是不确定的。

      【讨论】:

        【解决方案4】:

        sprintf 需要向它传递一个已经分配的足够大的字符缓冲区来存储任何可能的结果。这很容易受到缓冲区溢出的影响——您可能想改用更安全的 snprintf。一种低效但安全的方法:

        int bufsize = snprintf(NULL, 0, formatstring, ...);
        char *buffer = malloc(bufsize+1); # count doesn't include trailing nul
        if (buffer == NULL) out_of_memory_error();
        snprintf(buffer, bufsize+1, formatstring, ...);
        

        【讨论】:

          【解决方案5】:

          非常感谢!因为我需要一个 char*,所以我将代码重写为:

          for(i = 0;(i - 1)< n;i++)
          {
          char* b;
          char a[100];
          b = a;
          sprintf(b, "%d", i);
          }
          

          它就像一个魅力。我终于可以继续我的生活了!再次非常感谢您!

          【讨论】:

          • 您可以在此处使用 a 代替 b。之后你用它做什么?如果您的 char* 指向这样的自动数组,则在声明数组的块之后它将不可靠。
          猜你喜欢
          • 1970-01-01
          • 2012-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-06
          • 2013-02-26
          • 2015-04-23
          相关资源
          最近更新 更多