Можно ли привести непосредственно к записи? - PullRequest
0 голосов
/ 24 января 2019

Когда я создавал свой собственный malloc, я использовал write для вывода некоторого значения.

У меня нет проблем с выводом значения, я просто создаю переменную char для хранения своего числа и его печати,но я не понимаю, почему актерский состав не работает.Прототип записи:

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

Так что я бросил свой номер в void * без какого-либо результата.

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

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

Кто-то может объяснить, почему показ первой записинет ничего?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

(void *)(nb + '0') пытается разыменовать память по фактическому значению nb + '0', как если бы это значение было адресом. (nb + '0') не является l-значением, поэтому вы также не можете использовать оператор &. Что вы должны делать, это:

Если вы работаете в системе с прямым порядком байтов (похоже, в случае с OP):

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

Если вы используете систему с прямым порядком байтов:

char foo = (nb >> (CHAR_BIT * (sizeof(int) - 1))) & 0xff;
foo += '0';
write(..., &foo, ...);
0 голосов
/ 24 января 2019

Да, но это не приведение , это составной литерал :

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

или:

write(1, &(char){nb + '0'}, 1);
0 голосов
/ 24 января 2019

Преобразование в void * означает только то, что оно должно обрабатывать данное значение как указатель void. Но данный «адрес» равен 34 + «0», что явно неверно. Вы должны дать write указатель, чтобы что-то подобное не было возможно. Вы должны сохранить значение, которое вы хотите напечатать, где-нибудь в памяти и указать указатель на это место.

...