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

标签 c

我试图避免将固定缓冲区大小用于 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/

相关文章:

c - 将数据存储在struct或txt文件中?

c++ - 具有非阻塞控制台输入的跨平台方式

c - 为什么当输入大于9时程序会崩溃?

c - 错误 : lvalue required as unary ‘&’ operand, 我见过解决方案,但无法将它们与我的查询相关联

java - 使用 stdin 和 stdout 使用 Java 与外部 C 程序通信

c# - 从 C# 调用 c 方法

c - 简单的 C 项目来显示重复的数字

c - 将 Python/Matlab 移植到 C 和定点 DSP 处理器——C 也应该是定点的吗?

c - 奇怪的变量类型声明

c - 如何在 Opencv 和 C 中找到图像轮廓的角坐标