可以直接投写吗?

Is it possible to cast directly into write?

当我创建自己的 malloc 时,我使用 write 来打印一些值。

我在打印值时没有任何问题,我只是创建了一个 char 变量来存储我的号码并打印它,但我不明白为什么转换不起作用。 write的原型是:

ssize_t write(int fd, const void *buf, size_t count)

所以我在 void * 中投了我的号码,没有任何结果。

int nb = 3;
char numb = nb + '0';

write(1, (void *)(nb + '0'), 1); // Display nothing
write(1, &numb, 1); // Display 3

谁能解释一下为什么第一次写什么都不显示?

转换为 void* 仅意味着它应该将给定值视为 void 指针。 但是给定的 "address" 是 34 + '0' 这显然是无效的。 你必须给 write 一个指针,这样就不可能做那样的事情。您必须将要打印的值存储在内存中的某个位置,并提供指向该位置的指针。

(void *)(nb + '0') 试图在 nb + '0' 的实际值处取消引用内存,就好像该值是一个地址一样。 (nb + '0') 不是左值,因此您也不能在其上使用 & 运算符。你应该做的是:

如果您使用的是小端系统(似乎是 OP 的情况):

nb += '0';
write(..., &nb, ...);

如果您使用的是大端系统:

char foo = (nb >> (CHAR_BIT * (sizeof(int) - 1))) & 0xff;
foo += '0';
write(..., &foo, ...);

是的,但它不是 cast,它是 复合文字:

write(1, (char[]){nb + '0'}, 1);

或:

write(1, &(char){nb + '0'}, 1);