首页 > 解决方案 > 使用 sprintf 时大小为 1 的 char 数组的空终止

问题描述

我在大小为 1 的 char 数组上执行 sprintf 并且代码工作正常。即 strlen 返回 1 即使它可能不是以空值终止的。据我了解 sprintf 将执行空终止,但是在这种情况下它没有足够的空间。有人可以解释它起作用的原因吗?

#include <stdio.h>
#include <string.h>
#define STATUS "1"
int main(void){
    char *data = malloc(1);
    sprintf(data, "%s", STATUS);
    printf(">%s<\n", data);
    printf(">%d<\n", strlen(data));
}

输出

>1<
>1<

标签: cnullprintf

解决方案


该程序具有未定义的行为。

它之所以起作用,是因为通常 malloc 分配内存块的倍数是段落大小等于 16 或其他一些实现定义的值。


推荐阅读