C 将sizeof与sprintf/vsnprintf一起使用会损坏文本

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

我试图避免在sprintf和friends(安全原因)之类的东西上使用固定的缓冲区大小,但是,当我将其更改为使用arg2->arg1的大小时,我的程序文本输出已损坏/显示不正确/缺少某些部分

具体而言,即:

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;
}