是否可以直接转换为write?

时间:2019-01-24 15:13:46

标签: c unistd.h

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

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

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

所以我将我的电话号码强制为空*,没有任何结果。

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

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

有人可以解释为什么第一次写时什么都不显示?

3 个答案:

答案 0 :(得分:6)

是的,但这不是 cast ,而是复合文字

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

或:

plot.calculateMinMaxVals();
RectRegion bounds = plot.getBounds();

plot.setRangeBoundaries(
    bounds.getMinY().doubleValue() - 1, BoundaryMode.FIXED,
    bounds.getMaxY().doubleValue() + 1, BoundaryMode.FIXED);

plot.setDomainBoundaries(
    bounds.getMinX().doubleValue() - 1, BoundaryMode.FIXED,
    bounds.getMaxX().doubleValue() + 1, BoundaryMode.FIXED);

答案 1 :(得分:1)

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

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

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

如果您使用的是Big-endian系统:

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

答案 2 :(得分:0)

强制转换为void *意味着将给定值视为void指针。 但是给定的“地址”是34 +'0',这显然是无效的。 您必须给write一个指针,这样才能做不到这样的事情。您必须将要打印的值存储在内存中的某个位置,并提供指向该位置的指针。