Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
MrRovax
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 10
1

Разьясните char* и malloc()

06.09.2015, 17:54. Просмотров 991. Ответов 6
Метки нет (Все метки)

C
1
2
3
char* sieve = (char*) malloc( num + 1 );
    sieve[0] = 0;
    sieve[1] = 0;

Как создается этот массив?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2015, 17:54
Ответы с готовыми решениями:

В чем разница между malloc() и (char *)malloc()
Прошу помочь разобраться: не могу понять в чем разница...

Про char указатели, массивы и malloc
Если у меня есть функция, typedef struct CNS { char* title; int width;...

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include <stdio.h> #include <string.h> char tracks = { "ya ostavil svoe...

Assigning from int to char[10] from char to char[10]
добрый день, подскажите пожалуйста, в карточной колоде 52 карты, у меня есть...

Переход с 10 на 17 Студию 2440 =: невозможно преобразовать "const char [2] в char*
Доброго Нового года! Через пару дней сдавать контрольную работу, которую...

6
drfaust
318 / 206 / 79
Регистрация: 02.10.2008
Сообщений: 813
Записей в блоге: 1
Завершенные тесты: 1
06.09.2015, 18:05 2
Лучший ответ Сообщение было отмечено MrRovax как решение

Решение

Массив - последовательность к-то элементов фиксированного размера
char *sieve - указатель на область памяти, содержащую элементы типа char
malloc( num + 1 ); выделение области памяти размером num+1 байт. Т.к. предполагается, что sizeof(char) равен 1, и написали просто num+1, однако стандартом языка C размер char не определён, правильнее было бы написать sizeof(char)*(num+1).
malloc() возвращает просто указатель без указания типа элементов этого массива, т.е. void*, потому используется явное преобразование типа (char*).
sieve[0] = 0; - запись 0 в первый элемент массива(в C отсчёт идёт от 0, а не от 1, как в паскале)
1
MrRovax
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 10
06.09.2015, 18:32  [ТС] 3
Тоесть если num = 2 то выделяется память размером в 3 байта и элементами типа char?
0
drfaust
318 / 206 / 79
Регистрация: 02.10.2008
Сообщений: 813
Записей в блоге: 1
Завершенные тесты: 1
06.09.2015, 19:00 4
Точно
1
Black Fregat
2523 / 1281 / 349
Регистрация: 31.05.2009
Сообщений: 4,984
06.09.2015, 20:54 5
Цитата Сообщение от drfaust Посмотреть сообщение
однако стандартом языка C размер char не определён
Мне кажется, что Вы заблуждаетесь. В С99 написано
6.5.3.4 The sizeof operator
...
1124 When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
Добавлено через 4 минуты
Насколько я могу судить, стандарт сам байт понимает как единицу хранения char. Не ограничивая при этом количество бит в байте.
0
drfaust
318 / 206 / 79
Регистрация: 02.10.2008
Сообщений: 813
Записей в блоге: 1
Завершенные тесты: 1
06.09.2015, 21:03 6
Цитата Сообщение от Black Fregat Посмотреть сообщение
Насколько я могу судить, стандарт сам байт понимает как единицу хранения char. Не ограничивая при этом количество бит в байте.
Да, спутал. Размер char - 1 байт, а вот размер байта не фиксирован... Перепутал - извиняюсь. Размеры остальных (не char) целочисленных тоже не определены(зависят от архитектуры), за исключением специальных fixed_size типов
1
HighPredator
5681 / 2003 / 720
Регистрация: 10.12.2010
Сообщений: 5,761
Записей в блоге: 3
07.09.2015, 10:54 7
Цитата Сообщение от Black Fregat Посмотреть сообщение
однако стандартом языка C размер char не определён
Это "почти" так. Дело в том, что стандарт задает общий допустимый диапазон значений. Единственное требование по размеру, это "не менее 8-ми бит". То есть хоть инт. Формулировки в стандарте это вообще отдельная песня, колоссальное количество народу их курит, и не всегда успешно. Вменяемое разъяснение этой части было в фак-е к книге Harbison and Steele's. C: A Reference Manual, Third Edition, Prentice Hall, 1991:
В:
Is it allowable to have a C implementation in which type char can represent values ranging from -2,147,483,648 through 2,147,483,647? If so, what would be sizeof(char) under that implementation? What would be the smallest and largest ranges of type int?
О:
It is permitted (if wasteful) for an implementation to use 32 bits to represent type char. Regardless of the implementation, the value of sizeof(char) is always 1.
Тут следует не путать следующее: размер чара как типа данных не фиксирован стандартом по числу байт. И, разумеется, стандарт не может постулировать, что размер байта может иметь число бит, отличное от 8-ми. Именно поэтому sizeof(char) по стандарту всегда обязан возвращать 1 (байт). Согласен, очень мутно. Но, если вдуматься, то это единственный способ дать возможность программистам делать следующее:
1) иметь conformant-имплементацию, где чар как тип данных по представлению отличен от 8-ми бит;
2) иметь возможность оперировать байтами на любом уровне (частный случай: итерирование памяти).
1
07.09.2015, 10:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2015, 10:54

Ошибка в коде: несовместимы типы операндов (char и const char)
Текст не содержит знаков препинания и набран одинаковым шрифтом. Составить...

Error C2440: =: невозможно преобразовать 'char (*)[150]' в 'char *'
Есть следующая задача. Написать программу, которая запрашивает количество...

Const char нельзя присвоить сущность типа char
Здравствуйте! Начинаю изучать Си И вот у меня немного не получается написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru