С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 14.09.2016
Сообщений: 153

Ошибки компиляции, функция malloc

26.10.2017, 14:10. Показов 1744. Ответов 23

Студворк — интернет-сервис помощи студентам
Вот программа и уведомления об ошибках.
Миниатюры
Ошибки компиляции, функция malloc   Ошибки компиляции, функция malloc  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2017, 14:10
Ответы с готовыми решениями:

Ошибки в компиляции
Есть исходники: . Это исходники программы UPDchat (простейший чат в виде консоли). Так вот, не могу скомпилировать их. Помогите...

Ошибки при компиляции
Народ помогите откомпилить. При запуске make - ругается, что нет такого файла. Почему? Все файлы в архиве. Помогите очень срочно нужно!!!

Ошибки при компиляции Hello world в eclipse.
Скачал Eclipse IDE for C/C++ с сайта, распаковал, запустил, создал новый проект, написал #include <stdio.h> int main (void) { ...

23
30 / 36 / 9
Регистрация: 16.10.2017
Сообщений: 137
26.10.2017, 14:37
Давай с первой ошибки. Переменная buffer не объявлена. Объяви ее.
И скопируй код на форум. Нечего картинками кидаться.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
26.10.2017, 15:27
Да и выделение памяти сделано ...странно... (ТС, откройте для себя функцию calloc, тем более что man у вас открыт)
И не забудьте исправить форматирование
0
26.10.2017, 18:34

Не по теме:

И поставьте IDE :)

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2017, 18:57
Цитата Сообщение от Матричный бог Посмотреть сообщение
Вот программа
Код выкладывайте в текстовом виде, обрамляя тегами. Со скриншота читать неудобно.
0
0 / 0 / 0
Регистрация: 14.09.2016
Сообщений: 153
27.10.2017, 14:10  [ТС]
Цитата Сообщение от Братец Кролик Посмотреть сообщение
Переменная buffer не объявлена.
Как её объявить?
Цитата Сообщение от Братец Кролик Посмотреть сообщение
И скопируй код на форум.
Цитата Сообщение от MrGluck Посмотреть сообщение
Код выкладывайте в текстовом виде, обрамляя тегами. Со скриншота читать неудобно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char*argv[]){
int i; long l=512;
int out;
i=argc;
if (i<2) {
printf ("Usage: %s <filename>\n", argv[0]);
return (-1);
}         
if  ((out=open(argv[1], O_RDWR|O_CREAT, 0644))==-1){
printf ("error  while opening \'%S"",argv[1]);
}     
buffer=malloc(size_t)(l);
bzero(buffer);
write (out, buffer, (size_t)l);
close (out);        
}
Вот тут сообщения об ошибке
new.c: In function ‘main’:
new.c:17:1: error: ‘buffer’ undeclared (first use in this function)
buffer=malloc(size_t)(l);
^
new.c:17:1: note: each undeclared identifier is reported only once for each function it appears in
new.c:17:15: error: expected expression before ‘size_t’
buffer=malloc(size_t)(l);
^
new.c:18:1: warning: incompatible implicit declaration of built-in function ‘bzero’ [enabled by default]
bzero(buffer);
^
new.c:18:1: error: too few arguments to function ‘bzero’
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
27.10.2017, 14:43
Повторяю:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
ТС, откройте для себя функцию calloc, тем более что man у вас открыт
И не забудьте исправить форматирование
Далее, компилятору, как и нам, непонятно чего вы хотели добиться такой странной конструкцией buffer=malloc(size_t)(l);
учитывая что malloc принимает только один аргумент, к чему относить вторую пару скобок непонятно. Возвращаемый тип - указатель на void, то есть нужно явное приведение. Переменная или тип size_t, что это? В коде этого нет.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
30.10.2017, 13:48
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
то есть нужно явное приведение
Почему здесь нужно явное приведение?
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
30.10.2017, 14:29
Вованя, потому что malloc возвращает абстрактный указатель void*, а используется указатель на символ char*. В общем виде выделение массива выглядит так
C
1
any_type *arr = (any_type*)malloc(sizeof(any_type) * size);
либо я не понял вопрос
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 14:38
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Возвращаемый тип - указатель на void, то есть нужно явное приведение.
Как раз в Си лучше не использовать явное приведение памяти, возвращаемое malloc.
Подробности указаны например тут: Роберт Лав "LINUX системное программирование", глава 9, раздел "Выделение динамической памяти".
1
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
30.10.2017, 15:57
Язык C автоматически повышает указатели на void при любых типах назначения. Следовательно, в этих примерах мы обходимся без приведения типа возвращаемо*го значения malloc() к типу lvalue, используемому при назначениях. Однако в язы*ке C++ не выполняется автоматического повышения указателя на void, поэтому программисты, имеющие дело с C++, должны приводить тип возвращаемого зна*чения malloc() следующим образом:
name = (char *) malloc (512);
Где тут "лучше не использовать"? Тут сказано "можно не использовать".
Но для совместимости с С++ лучше использовать.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 16:23
Для совместимости с С++ пишут на С++.
Приведение может приводить к трудноуловимым ошибкам, требует дублирование, несёт в себе избыточную информацию.
А в С++ просто запрещено использовать автоматическое приведение типа. Отсюда (и ещё по причине того, что раньше возвращался char*) и породилась волна примеров в сишных учебниках с приведением типа.

На Си лучше не приводить возвращаемый void*, а если кто-то пытается компилировать сишный код плюсовым компилятором - это не проблема языка и не повод ставить себе грабли.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
30.10.2017, 16:51
Цитата Сообщение от MrGluck Посмотреть сообщение
Приведение может приводить к трудноуловимым ошибкам
Например?
Цитата Сообщение от MrGluck Посмотреть сообщение
несёт в себе избыточную информацию
Напротив, страховка от ошибок: если изменился тип переменной, а в sizeof это сделать забыли, неявное приведение пропустит, а явное выдаст ошибку.
Цитата Сообщение от MrGluck Посмотреть сообщение
На Си лучше не приводить возвращаемый void*
Причину-то назовите.
Цитата Сообщение от MrGluck Посмотреть сообщение
если кто-то пытается компилировать сишный код плюсовым компилятором...
...то надо постараться чтобы это получилось неправильно. Хотя языки и разные, большая часть кода на Си может скомпилироваться плюсовым компилятором без ошибок.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 17:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Например?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdlib.h>
 
typedef struct
{
    int dummy;
} TLData;
 
typedef struct
{
    char dummy;
} TData;
 
int main(void)
{
    TLData  *p1 = (TData*) malloc(sizeof(TLData));  /* oops1 */
    TLData **p2 = (TLData*)malloc(sizeof(TLData*)); /* oops2 */
    free(p1);
    free(p2);
    return 0;
}
Потом, меняется тип - изменять надо в 3 местах.
Правильный подход:
C
1
TLData *p = malloc(sizeof *p);
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а в sizeof это сделать забыли
sizeof тут не при чём. Мы же говорим об изменении типа в касте возвращаемого значения
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
то надо постараться чтобы это получилось неправильно
Почти любой большой проект, изначально написанный под Си при портировании под С++ выдаёт тонну ошибок. Да даже переход между версиями одного и того же компилятора - вещь не простая, а вы о разных ЯП говорите.

Напоследок:
Почему при выделении памяти перед malloc явно указывают тип?
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
30.10.2017, 18:07
Цитата Сообщение от MrGluck Посмотреть сообщение
sizeof тут не при чём. Мы же говорим об изменении типа в касте возвращаемого значения
Мы говорим о типе переменной. Если изменили только его, но забыли в malloc'е, явное приведение на это укажет. А уж там да, придется править в двух местах.
Цитата Сообщение от MrGluck Посмотреть сообщение
Например
$ gcc main.c -Wall
main.c: In function ‘main’:
main.c:15:19: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
TLData *p1 = (TData*) malloc(sizeof(TLData)); /* oops1 */
^
main.c:16:19: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
TLData **p2 = (TLData*)malloc(sizeof(TLData*)); /* oops2 */

Спасибо что подтвердили мою точку зрения. Только ведь вы не этого добивались?
Цитата Сообщение от MrGluck Посмотреть сообщение
Почти любой большой проект, изначально написанный под Си при портировании под С++ выдаёт тонну ошибок.
Это повод еще ухудшать совместимость?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 18:21
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Спасибо что подтвердили мою точку зрения
То есть успешная компиляция вам ни о чём не говорит? Полагаетесь на warning конкретного компилятора?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это повод еще ухудшать совместимость?
За совместимостью С/С++ гоняетесь только вы на этом форуме. Причём что в ветках Си, что в ветках С++.
Языки Си и С++ - совершенно разные, с разной философией и идеологией. И чтобы на первых порах использовать написанные на Си библиотеки, в С++ оставили частичную совместимость, но:
1. совместимость не 100%
2. кому она сейчас нужна в 2017? То есть кто сейчас умышленно пишет код, который будет работать под Си и под С++? И чем приходится жертвовать ради этой "совместимости"?

На два стула не сядешь.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
30.10.2017, 19:49
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть успешная компиляция вам ни о чём не говорит? Полагаетесь на warning конкретного компилятора?
Мой вариант хотя бы warning выдает, ваш - нет. Так что да, я предпочитаю чтобы компилятор мне помогал искать ошибки.
Цитата Сообщение от MrGluck Посмотреть сообщение
За совместимостью С/С++ гоняетесь только вы на этом форуме.
Что плохого в том что код минимально привязан к конкретному компилятору?
Цитата Сообщение от MrGluck Посмотреть сообщение
И чем приходится жертвовать ради этой "совместимости"?
Частенько - ничем. В данном случае немного усложняем модификацию кода (изменение в 3-х местах вместо 2-х), зато получаем страховку от ошибок и переносимость.
Плюс к тому, области несовместимости между этими языками часто являются следствием подсказывают потенциальные ошибки и нарушения стандарта - на это тоже хорошо бы обращать внимание.
0
30.10.2017, 19:55

Не по теме:

Сдается мне, что это трололо ибо совсем упорото как-то.

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.10.2017, 21:30
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мой вариант хотя бы warning выдает, ваш - нет
Я из кода приводил лишь
C
1
TLData *p = malloc(sizeof *p);
Ну так варнинга не выдаёт потому что он и не допускает возможность допустить ошибку.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так что да, я предпочитаю чтобы компилятор мне помогал искать ошибки.
Я тоже предпочитаю, но если есть возможность вообще избежать ошибку - выбираю этот вариант.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
изменение в 3-х местах вместо 2-х
Вместо одного (см выше).
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
страховку от ошибок
Какую страховку? Мы её как раз теряем. Чем больше мест приходится менять - тем больше ошибок. Тем более, все эти 3 места связываются лишь "совестью программиста".
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
переносимость
Когда говорят о переносимости - подразумевают разные платформы, разрядности ОС, но никак не ЯП.
Кто из Великих признанных программистов агитировал писать код так, чтобы он собирался компиляторами под разные ЯП? Я таких не знаю. Зато много где встречал советы не переносить привычки и подходы из других языков.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,902
30.10.2017, 23:11
Цитата Сообщение от MrGluck Посмотреть сообщение
Вместо одного (см выше).
Не уходите от темы. Разговор шел о работе с массивами. Так что выбор идет между этими вариантами:
C
1
2
3
4
5
6
TLData *arr;
int size = calc_size();
...
arr = malloc( sizeof(TLData) * size );
...
arr = (TLData*)malloc( sizeof(TLData) * size );
Цитата Сообщение от MrGluck Посмотреть сообщение
Какую страховку? Мы её как раз теряем. Чем больше мест приходится менять - тем больше ошибок. Тем более, все эти 3 места связываются лишь "совестью программиста".
В вашем варианте да. Тип данных задается в трех местах: при объявлении переменной и 2 раза в выделении памяти. Причем два последних раза в одном месте и если есть мало-мальская привычка (или макрос), они меняются вместе, в отличие от первого, изменение которого вполне может "оторваться".
Цитата Сообщение от MrGluck Посмотреть сообщение
Когда говорят о переносимости - подразумевают разные платформы, разрядности ОС, но никак не ЯП.
Еще раз: пока это работает на пользу - почему нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2017, 23:11
Помогаю со студенческими работами здесь

Ошибки во время компиляции ядра для Распбери Пи
Здравствуйте, я попробовал скомпилировать ядро для Raspberry Pi 2 следуя официциальным инструкциям с одним только изменением:...

Не отрабатывает функция printf(), при условии удачной компиляции программы
#include &lt;stdio.h&gt; #define IN 1 #define OUT 0 int main(){ int c, nl, nw, nc, state; state = OUT; nl = nw =...

Функция Malloc
Помогите изучить функцию Malloc что она делает или дайте учебник где она описана! Начальный курс давно закончил, хорошо разбираюсь в...

Функция malloc
Как внутри работает функция malloc? Непонятно следующее - если требую выделить несколько байт памяти, то как они выбираются, чтобы они...

Своя функция malloc
В процессе написания сапера я пользовался функцией malloc для выделения памяти. Я копался в заголовочных файлах дабы найти её исходный код,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru