我正在大小为 1 的字符数组上执行 sprintf,代码工作正常。 即 strlen 返回 1,即使它可能不是以 null 结尾的。据我了解,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<
程序具有未定义的行为。
它之所以有效,是因为通常 malloc 分配内存块乘以等于 16 的段落大小或其他一些实现定义的值。
你想要snprintf()
if (snprintf(data, SIZE, "%s", STATUS) >= SIZE) /* not enough space */;
#include <stdio.h>
int main(void) {
char buf[10];
for (int k = 0; k < 6; k++) {
int res = snprintf(buf, k, "%s", "foo");
printf("%d: snprintf() returned %d; buf has [%s] (%d chars)n",
k, res, buf, (int)strlen(buf));
}
return 0;
}
程序输出
0: snprintf(( 返回 3; buf 有 [] (0 个字符( 1: snprintf(( 返回 3;buf 有 [] (0 个字符( 2: snprintf(( 返回 3;布夫有 [f](1 个字符( 3: snprintf(( 返回 3;布夫有 [fo](2 个字符( 4: snprintf(( 返回 3;布夫有 [foo] (3 个字符( 5: snprintf(( 返回 3;布夫有 [foo] (3 个字符(
见 ideone