C 将sizeof与sprintf/vsnprintf一起使用会损坏文本
我试图避免在sprintf和friends(安全原因)之类的东西上使用固定的缓冲区大小,但是,当我将其更改为使用arg2->arg1的大小时,我的程序文本输出已损坏/显示不正确/缺少某些部分 具体而言,即:C 将sizeof与sprintf/vsnprintf一起使用会损坏文本,c,C,我试图避免在sprintf和friends(安全原因)之类的东西上使用固定的缓冲区大小,但是,当我将其更改为使用arg2->arg1的大小时,我的程序文本输出已损坏/显示不正确/缺少某些部分 具体而言,即: vsnprintf(putbuf, LARGE_BIG_BUFFER_SIZE, format, args); 到 我的文本输出全部损坏/简短,大小更改很简单。我错过什么了吗 原始功能: to_screen(const char *format,...) { if (win
vsnprintf(putbuf, LARGE_BIG_BUFFER_SIZE, format, args);
到
我的文本输出全部损坏/简短,大小更改很简单。我错过什么了吗
原始功能:
to_screen(const char *format,...)
{
if (window_display && format) {
va_list args;
va_start(args, format);
vsnprintf(putbuf, LARGE_BIG_BUFFER_SIZE, format, args);
va_end(args);
}
}
可能
sizeof
的计算结果是指向缓冲区的指针的宽度,而不是实际缓冲区的大小
有关解决此问题的其他建议,请参阅: 要分配足够大的字符串并打印到其中(glibc 2.0和glibc 2.1的代码都正确):
#包括
#包括
#包括
字符*make_消息(常量字符*fmt,…){
/*我想我们不需要超过100字节*/
int n,大小=100;
char*p,*np;
va_列表ap;
如果((p=malloc(size))==NULL)
返回NULL;
而(1){
/*尝试在分配的空间中打印*/
va_启动(ap、fmt);
n=vsnprintf(p、尺寸、fmt、ap);
va_端(ap);
/*如果有效,则返回字符串*/
如果(n>-1&&n-1)/*glibc 2.1*/
大小=n+1;/*正是所需的*/
else/*glibc 2.0*/
尺寸*=2;/*旧尺寸的两倍*/
if((np=realloc(p,size))==NULL){
自由基(p);
返回NULL;
}否则{
p=np;
}
}
}
可能sizeof
的计算结果是指向缓冲区的指针的宽度,而不是实际缓冲区的大小
有关解决此问题的其他建议,请参阅: 要分配足够大的字符串并打印到其中(glibc 2.0和glibc 2.1的代码都正确):
#包括
#包括
#包括
字符*make_消息(常量字符*fmt,…){
/*我想我们不需要超过100字节*/
int n,大小=100;
char*p,*np;
va_列表ap;
如果((p=malloc(size))==NULL)
返回NULL;
而(1){
/*尝试在分配的空间中打印*/
va_启动(ap、fmt);
n=vsnprintf(p、尺寸、fmt、ap);
va_端(ap);
/*如果有效,则返回字符串*/
如果(n>-1&&n-1)/*glibc 2.1*/
大小=n+1;/*正是所需的*/
else/*glibc 2.0*/
尺寸*=2;/*旧尺寸的两倍*/
if((np=realloc(p,size))==NULL){
自由基(p);
返回NULL;
}否则{
p=np;
}
}
}
将代码放在某个地方:
printf ("size is %d\n", sizeof (putbuf));
如果它是一个指针,您可能会得到四个或八个,因为这将是您系统上指针的大小(目前四个或八个是常见的,但这完全取决于指针的大小)
请记住,在绝大多数情况下,数组将衰减为指针
例如:
#include <stdio.h>
void fn (char x[]) {
printf ("size in fn = %zd\n", sizeof (x));
}
int main (void) {
char x[100];
printf ("size in main = %zd\n", sizeof (x));
fn (x);
return 0;
}
如果要传递实际大小信息,则需要显式传递:
#include <stdio.h>
void fn1 (char x[]) {
printf ("size in fn1 = %zd\n", sizeof (x));
}
void fn2 (char x[], size_t szx) {
printf ("size in fn2 = %zd\n", szx);
}
int main (void) {
char x[100];
printf ("size in main = %zd\n", sizeof (x));
fn1 (x);
fn2 (x, sizeof (x));
return 0;
}
把你的代码放在某个地方:
printf ("size is %d\n", sizeof (putbuf));
如果它是一个指针,您可能会得到四个或八个,因为这将是您系统上指针的大小(目前四个或八个是常见的,但这完全取决于指针的大小)
请记住,在绝大多数情况下,数组将衰减为指针
例如:
#include <stdio.h>
void fn (char x[]) {
printf ("size in fn = %zd\n", sizeof (x));
}
int main (void) {
char x[100];
printf ("size in main = %zd\n", sizeof (x));
fn (x);
return 0;
}
如果要传递实际大小信息,则需要显式传递:
#include <stdio.h>
void fn1 (char x[]) {
printf ("size in fn1 = %zd\n", sizeof (x));
}
void fn2 (char x[], size_t szx) {
printf ("size in fn2 = %zd\n", szx);
}
int main (void) {
char x[100];
printf ("size in main = %zd\n", sizeof (x));
fn1 (x);
fn2 (x, sizeof (x));
return 0;
}
putbuf
是如何声明的以及在哪里声明的?您还应该检查打印函数的返回值。如果putbuf是一个数组,sizeof将仅返回以字节为单位的数组大小。即使在这种情况下,如果它是大小为10的整数数组,sizeof也会返回40(假设32位机器的int大小为4);在链中设置,即:putbuf=my\u malloc(大缓冲区大小+1);putbuf
是如何声明的以及在哪里声明的?您还应该检查打印函数的返回值。如果putbuf是一个数组,sizeof将仅返回以字节为单位的数组大小。即使在这种情况下,如果它是大小为10的整数数组,sizeof也会返回40(假设32位机器的int大小为4);在链中设置,即:putbuf=my_malloc(LARGE_BIG_BUFFER_SIZE+1);'我看到的尺寸是8英尺。我是否应该在代码中保留固定的缓冲区大小?@user1621581如果将缓冲区作为参数传递给int[]形式的函数,即int数组,则仍然可以使用的大小。请记住,的大小返回字节数,而不是元素数。因此,如果您有一个大小为10的整数数组,sizeof array将返回40(假设为32位整数)@user1621581您应该做的是在传递给vsnprintf时使用相同的值来分配putbuf。e、 例如,#定义PUTBUF_大小576。。。putbuf=malloc(putbuf_大小)。。。vnsprintf(putbuf,putbuf_SIZE…
…如果putbuf的大小是可变的,那么就使用该变量。这并不重要,因为putbuf只是‘static char*putbuf=NULL;’@user1621581,我希望您在使用它做任何事情之前,实际上已经为此分配了一些内存,是吗?‘大小是8’是我看到的。我是否应该将固定的缓冲区大小保留在co中de?@user1621581如果将缓冲区作为参数传递给int[]形式的函数,即int数组,则仍然可以使用大小。请记住,大小的返回字节数,而不是元素数。因此,如果有大小为10的整数数组,则大小的数组将返回40(假定为32位整数)@user1621581您应该使用与传递给vsnprintf相同的值来分配putbuf。例如,#定义putbuf大小576…putbuf=malloc(putbuf大小)…vnsprintf(putbuf,putbuf_SIZE…
…如果putbuf的大小是可变的,那么就使用该变量。这并不重要,因为putbuf只是“static char*putbuf=NULL;”@user1621581,我希望您实际上是在分配
#define SZ 512
int main (void) {
char *x = malloc (SZ); // warning, may fail, irrelevant here.
printf ("size in main = %zd\n", sizeof (x));
fn2 (x, SZ);
free (x);
return 0;
}