我有以下代码中的问题:

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

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

有帮助吗?

解决方案

sprintf将数据写入到一个现有的缓冲器,其中传递到它作为第一个参数。目前你没有指定为b。在所有(IIRC在C)的值,这意味着该值可以是任何东西。如果你将它设置为NULL或0,sprintf是要尝试写入内存起始地址为0。

您需要创建适当大小的缓冲器,以便能sprintf的写进去。例如:

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

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

其他提示

唔......你的指针B包含垃圾因为你还没有初始化,或分配的空间。 Springtf要求您已经分配的目标缓冲区空间...

在最低限度,你想要的东西,比如CHAR B [50]或任何最大尺寸你期待,而不仅仅是一个char *。

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

的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, ...);

非常感谢您!因为我需要一个char *我改写的代码:

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

和它的工作原理类似一个魅力。我终于可以现在得到继续我的生活!再次感谢你非常非常感谢!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top