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

В чем разница между malloc() и (char *)malloc()

28.10.2009, 18:18. Просмотров 10507. Ответов 7
Метки нет (Все метки)

Прошу помочь разобраться: не могу понять в чем разница между
C
1
s=malloc(sizeof(char));
и
C
1
s=(char *)malloc(sizeof(char));
Буду признателен вашим объяснениям.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2009, 18:18
Ответы с готовыми решениями:

Разьясните char* и malloc()
char* sieve = (char*) malloc( num + 1 ); sieve = 0; sieve = 0; Как создается этот...

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

Функция malloc() - найти разницу между двумя реализациями
Добрый вечер. Скажите, пожалуйста, есть ли разница между записями:...

Отличия между функциями malloc, calloc и realloc и способами их использования
На этом форуме есть множество тем по функциям malloc, calloc и realloc, но я так и не понял чем они...

Не работает malloc
#include <stdio.h> #include <stdlib.h> void create(int *x); int main() { int *x,i;...

7
blackswan
14 / 14 / 0
Регистрация: 08.07.2009
Сообщений: 61
28.10.2009, 18:19 2
изначально malloc выдаёт тип void *, некоторые компиляторы не делают неявного преобразования к конкретному типу, и скажут, что тут ошибка, поэтому пишется преобразование типов, в данном случае (char *), если s типа char *
1
ser1801
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 3
28.10.2009, 18:24  [ТС] 3
Ок, ясно. Ещё вопрос: в институте требуют написать 3 программы для решения одной задачи.
1) используя маллок, строка как массив символов.
2) используя каллок и реаллок, строка как строка.
3)сохранение в файл и чтение из него условия.

Технически я это реализовал, только не могу понять почему память не надо добавлять реаллоком в 1) случае?

вот ффункция ввода

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* vvod(){
char *s, c;
int i=0;
s= (char*)malloc(sizeof(char));
 
if (!s) {printf("HET naM9ITu!"); getch(); exit(0);}
 
printf("BBeguTE CTPOKy :");
    while((c=getchar())!='\n'){
         s[i]=c;
         if(!s){
                 printf("HET naM9ITu!");
                 exit(0);
               }
         i++;
         }
    s[i] = '\n';
return s;
        }
Ведь в строчке s= (char*)malloc(sizeof(char)); память выделяется размером в 1 чар, или я недопонимаю?
0
blackswan
14 / 14 / 0
Регистрация: 08.07.2009
Сообщений: 61
28.10.2009, 18:33 4
так делать нельзя, если s - массив символов, то нужно указать размер выделяемой под него памяти, т.е.
C
1
s = (char *)malloc(N*sizeof(char));
где N - количество элементов массива, вот здесь
C
1
s[i]=с
легко могла появится ошибка во время выполнения, так как программа может вылезти за пределы выделенной памяти (сейчас там выделен 1 байт под один элемент char). И внутри цикла нет смысла проверять (!s), так как это указатель, и его значение может быть либо каким угодно (не только NULL, как предполагается в проверке), либо указывать на начало выделенной области памяти. Подобно работают и calloc и realloc.
0
28.10.2009, 18:33
ser1801
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 3
28.10.2009, 18:36  [ТС] 5
Но программа работает и я не понимаю почему...
0
odip
Эксперт С++
7167 / 3225 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
29.10.2009, 13:37 6
изначально malloc выдаёт тип void *, некоторые компиляторы не делают неявного преобразования к конкретному типу, и скажут, что тут ошибка
Что значит - некоторые ?
Компилятор C может выдать warning.
Компилятор C++ по идее должен выдать error.
0
blackswan
14 / 14 / 0
Регистрация: 08.07.2009
Сообщений: 61
29.10.2009, 18:04 7
odip, Вы тоже сказали фразу "по идее". Вы не уверены?
Я знаю с десяток компиляторов С и С++, но работал всего с несколькими и точно не могу сказать, какой как на это реагирует. Часть ругалась, часть нет.
0
odip
Эксперт С++
7167 / 3225 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
30.10.2009, 16:53 8
Компилятор C не выдает warning (gcc 3).
Компилятор C++ выдает ошибку (gcc 3) - не могу привести тип void* к int*.

То есть в C++ обязательно явно нужно приводить.
0
30.10.2009, 16:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2009, 16:53

Malloc.h not found
Всем привет, написал программу, но ругается "malloc.h not found" Вот собственно код, пишу на Xcode...

Деление чисел на malloc
Деление чисел Даны два целых положительных числа a и b. Требуется найти частное и остаток от...

Уточнение по операции malloc в C
Здравствуйте, вот вопрос. Операция malloc выдаёт указатель, то есть она выдаёт его с * или без. Я...


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

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

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