我遇到以下代码的问题:
for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}
它编译得很好,但当我运行它时,它给我臭名昭着的“0XC0000005访问冲突”错误。我已经尝试将b设置为NULL,“”,“0”,0和其他一些东西,但后来我得到“0XC0000005访问冲突”错误或“表达式:字符串!= NULL。任何帮助将不胜感激!
答案 0 :(得分:7)
sprintf
将数据写入现有缓冲区,并将其作为第一个参数传递给它。目前你根本没有为b指定一个值,这意味着(C中的IIRC)值可以是任何值。如果将其设置为NULL或0,sprintf
将尝试从地址0开始写入内存。
您需要创建适当大小的缓冲区,以便sprintf可以写入它。例如:
for(i = 0;(i - 1)< n;i++)
{
char b[10];
sprintf(b, "%d", i);
}
当然实际你想要如何分配缓冲区取决于你的真实代码想要对结果做什么。当然。
答案 1 :(得分:1)
嗯...你指向b的指针包含垃圾,因为你没有初始化它或分配空间。 Springtf要求您分配目标缓冲区空间...
至少,你需要像char b [50]或你期望的任何最大尺寸,而不仅仅是char *。
答案 2 :(得分:1)
char *是指向char或char数组的未初始化指针。您需要定义一个缓冲区char [10],否则sprintf的目标地址是未定义的。
答案 3 :(得分: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, ...);
答案 4 :(得分:0)
非常感谢!因为我需要一个char *我重写了代码:
for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}
它就像一个魅力。我现在终于可以继续我的生活!再次非常感谢你!