Почему не строка кода: char * n = mallo c (sizeof (int)); кинуть ошибку? - PullRequest
0 голосов
/ 11 апреля 2020

В C я понимаю, что тип символа равен 1 байту, а тип int равен 4 байта. Мне было интересно, почему следующий код не выдает ошибку:

char *n = malloc(sizeof(int));

n предназначен для указания на часть памяти, которая составляет 1 байт, но ссылается на часть 4 байта памяти, не должно ли это вызвать проблемы?

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

Почему нет строки кода: char * n = mallo c (sizeof (int)); выдает ошибку?

Поскольку язык программирования C не имеет stati c проверки типов и позволяет писать код, который не является "безопасным для типов". Интерфейс, предоставляемый malloc, возвращает указатель, который является просто абстрактным void* указателем, который может использоваться любым возможным способом и может быть свободно преобразован в любой другой тип указателя.

Язык C позволяет для приведения значения между любыми двумя типами, и нет никакой проверки типа присвоений. Вы можете делать любые ошибки, и компилятор не обязан сообщать о них каким-либо образом. Мы, C программисты, несем ответственность за написание правильного C кода, который читабелен, понятен, корректен и, что наиболее важно, следует правилам языка, чтобы не было «неопределенного поведения».

1 голос
/ 11 апреля 2020

n предназначен для указания на часть памяти, которая составляет 1 байт

Не совсем, это также может указывать на больше , чем один байт выделенная память.

См., например:

char *str;
str = malloc(100);

Начиная с sizeof(int) > sizeof(char), вы определенно можете сделать malloc(sizeof(int)), даже если результат предназначен для использования в качестве указателя char *. Технически это не неправильно , поскольку sizeof просто оценивает размер больше 1, но это, безусловно, плохой код.

0 голосов
/ 11 апреля 2020

Используя функцию malloc, мы можем выделить блок памяти. Таким образом, он может указывать либо на байт памяти, либо на несколько байт памяти. char *ptr может указывать на символьную переменную или действовать как char ptr[n], где n - это размер символьного массива. Также имейте в виду, что malloc возвращает void pointer, поэтому, чтобы избежать любого типа ошибки в вашей программе, замените ваш код на: -

ch *n = (char *)malloc(sizeof(int));
...