1

我对以下代码有疑问:

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

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

4

5 回答 5

7

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

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

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

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

于 2008-12-07T20:41:47.577 回答
1

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

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

于 2008-12-07T20:39:37.270 回答
1

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

于 2008-12-07T20:43:22.067 回答
1

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, ...);
于 2008-12-07T20:48:28.233 回答
0

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

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

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

于 2008-12-07T20:48:25.660 回答