Почему memset принимает int вместо char? - PullRequest
45 голосов
/ 07 мая 2011

Почему memset принимает int как второй аргумент вместо char, тогда как wmemset принимает wchar_t вместо чего-то вроде long или long long?

Ответы [ 3 ]

49 голосов
/ 07 мая 2011

memset предшествует (довольно немного) добавлению прототипов функций к C. Без прототипа вы не можете передать char функции - когда / если вы попытаетесь , он будет повышен до int, когда вы передадите его, а функция получит int.

Стоит также отметить, что в C (но не в C ++) символьный литерал типа 'a' имеет не имеет тип char - он имеет тип int, так что вы передаете обычно все равно начинается с int. По сути, единственный способ начать его как персонажа и получить повышение - это передать переменную char.

Теоретически, memset, вероятно, можно изменить, так что он получает char вместо int, но вряд ли будет какая-либо выгода и довольно приличная возможность взлома какого-то старого кода или другого. С неизвестной, но потенциально довольно высокой ценой и практически без шансов на реальную выгоду, я бы сказал, что шансы на ее изменение, чтобы получить падение char прямо на грани между "тонким" и "ничем".

Редактировать (отвечая на комментарии): CHAR_BIT младшие значащие биты int используются в качестве значения для записи в цель.

7 голосов
/ 07 мая 2011

Вероятно, по той же причине, по которой функции в <ctypes.h> принимают ints, а не chars.

На большинстве платформ char слишком мал, чтобы помещать его в стек самостоятельно, поэтому обычно тип выталкивается ближе к размеру слова машины, т.е. int.

Как указывает ссылка в комментарии @ Gui13 , это также повышает производительность.

0 голосов
/ 07 мая 2011

См. Ответ Фреда, это из соображений производительности.

Со своей стороны, я попробовал этот код:

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[])
{
    char c = 0x00;

    printf("Before: c = 0x%02x\n", c);
    memset( &c, 0xABCDEF54, 1);
    printf("After:  c = 0x%02x\n", c);

    return 0;
}

И это дает мне это на 64-битном Mac:

Before: c = 0x00
After:  c = 0x54

Итак, как вы видите, записывается только последний байт. Я думаю, это зависит от архитектуры (порядковый номер).

...