可以直接投写吗?
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);
当我创建自己的 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);