我试图避免将固定缓冲区大小用于 sprintf 和 friend 之类的东西(出于安全原因),但是,当我将其更改为对 arg2 -> arg1 使用 sizeof 时,我的程序文本输出已损坏/未损坏正确显示/缺少某些部分。
具体来说,即:
vsnprintf(putbuf, LARGE_BIG_BUFFER_SIZE, format, args);
到
vsnprintf(putbuf, sizeof putbuf, format, args);
我的文本输出全部损坏/由于简单的 sizeof 更改而变短。我错过了什么吗?
原始函数:
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);
}
}
最佳答案
将你的代码放在某处:
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;
}
在我的系统上输出:
size in main = 100
size in fn = 4
如果你想传递实际尺寸信息,你需要明确地做:
#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;
}
或者,对于分配的内存:
#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;
}
关于c - 将 sizeof 与 sprintf/vsnprintf 一起使用会损坏文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12598839/