разница между <stdlib.h> и <malloc.h>

Когда я используюmalloc в программе на Си я получаю предупреждение:

warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]

Я могу тогда включить или же избавиться отwarning хотя это работает и без него.

Так что мне было интересно, чтоРазница между этими заголовками и какойgcc ссылки, когда я нечто-нибудь включить?

(Я'м используюubuntu 12.04 64-bit с )gcc 4.6.3

 Austin Adams30 нояб. 2017 г., 06:52
какого черта, это недубликат вообще

Ответы на вопрос(6)

Решение Вопроса

 заголовок устарел (и довольно специфичен для Linux, на котором он определяетнестандартный функции какmallinfo (3)). использование вместо этого, если вам просто нужнотаНос (3) и связанные стандартные функции (например,freecallocrealloc ....). Заметить, что определяетсяC89 (и более поздние) стандарты, но не

Смотреть в/usr/include/malloc.h вы'найду там несколько нестандартных функций (например,malloc_stats (3)и т.д ...) - в дополнение кmalloc....

А такжеgcc дон»t ссылки на заголовочные файлы, но библиотеки. Читать ЛевинаКнига олинкеры и погрузчики для большего.

Если вы нене включать заголовки (и не объявлять явноmalloc себя, что было бы плохой идеей),malloc неявно объявлен как возвращающий некоторыеint значение (что неверно). Я приглашаю вас пройти хотя бы-Wall флаг дляgcc при его использовании.

Вы также можете пройти-v вgcc чтобы понять актуальные программы:cc1 правильный компилятор (создающий ассемблерный код),as ассемблер,ld компоновщик иcollect2 внутренняя утилита, которая вызывает компоновщик.

 Basile Starynkevitch19 окт. 2012 г., 13:37
Ссылка это хороший термин. Но линкер неНе знаю сигнатуру функций C, только их имена. Только собственно компилятор (cc1 начатоgcc) заботиться о сигнатуре типа функций. "
 Joel Cunningham02 дек. 2015 г., 21:02
Удивительно, но memalign () является одной из нестандартных функций, объявленных в malloc.h. Это'не является частью стандартной библиотеки C
 Basile Starynkevitch08 нояб. 2015 г., 15:47
 может быть как живым (существующий заголовок), так и устаревшим (рекомендуется не использовать)
 ShadowRanger13 февр. 2016 г., 00:26
@JoelCunningham: этопотому что единственные стандартизированные именаposix_memalign (POSIX) иaligned_alloc  (С11).memalign само по себе "устаревший и нестандартный ».
 jww08 нояб. 2015 г., 15:38
<malloc.h> заголовок устарел ... » - Мне просто нужно было включить его в систему Debian 8.2 с GCC 4.9. Видимо, это живое и здоровое ....
 none19 окт. 2012 г., 13:35
Вы, я думаю, связывание было неправильным термином. Я хотел спросить, какgcc находитьmalloc работать, когда я нене включать заголовки?

 не является стандартным заголовком и поэтому не является переносимым. Стандарт ставитmalloc() и другие. в .

По умолчанию gcc не читает ни того, ни другого.

Когда вы прочитаете их, вы увидите, что они заявляютmalloc по-другому.

Что касается предупреждения, когда ни то, ни другое не включено, это определение того, как работают функции C. Функция без прототипа (то, что у вас есть, когда вы нене объявляй свое и незаголовок с одним) рассматривается как функция сint тип возврата инеопределенные список аргументов.

Компилятор выполнит продвижение по умолчанию (например, float to double и другие), и функция будет вызвана. Если число аргументов, используемых функцией, отличается от переданного числа, или если типы аргументов после продвижений по умолчанию не совместимы с функцией 'Реализация, это неопределенное поведение.

См. ISO 9899: 1999 (C99) §6.5.2.2, ¶ 6:

Если выражение, обозначающее вызываемую функцию, имеет тип, который не содержит прототип, целочисленные преобразования выполняются для каждого аргумента и аргументов, которые имеют типfloat повышены доdouble, Это называетсяпродвижение аргумента по умолчанию, Если количество аргументов не равно количеству параметров, поведение не определено. Если функция определена с типом, который включает в себя прототип, и либо прототип заканчивается многоточием (, ...), либо типы аргументов после продвижения не совместимы с типами параметров, поведение не определено. Если функция определена с типом, который не включает прототип, и типы аргументов после продвижения не совместимы с типами параметров после продвижения, поведение не определено, за исключением следующих случаев:

один повышенный тип является целочисленным типом со знаком, другой повышенный тип является целочисленным типом без знака, и значение представимо в обоих типах;оба типа являются указателями на квалифицированные или неквалифицированные версии типа символа или.void

В случае вызоваmalloc() без прототипа это может быть очень плохо.malloc() принимаетsize_t аргумент и возвращаетvoid * указатель. Если результат продвижения по умолчанию вашего целочисленного аргумента дает целое число, отличающееся по размеру отsize_t, у вас будет неопределенное поведение. И еслиint отличается от размераvoid * (например, в 64-битных системах, гдеint часто 32-битный иvoid * будет 64-битным,) возвращенный указатель будет испорчен.

malloc

Если вы нене включать ни один из них, то вы неу нас есть прототип дляmallocотсюда и предупреждение. Но вы ссылаетесь на одну и ту же функцию независимо, потому что есть только однаmalloc функция. Это'Просто объявлено в двух местах. Форвард-декларации нет, чтобы помочь ссылку противmalloc функции оничтобы компилятор мог выдавать правильный код вокруг вызова, указывать аргументы и читать возвращаемое значение.

Обратите внимание, что не является стандартным включением. Я недумаюstdlib.h когда-либо включаетmalloc.h на GCC, но вы можете себе представить, что это может с тех порОдин из способов предоставить необходимую декларацию.

 none19 окт. 2012 г., 13:33
просто чтобы прояснить, это недайте мнеerror ноwarning, Программа прекрасно работает без меня, включая все, что угодно.
 Steve Jessop19 окт. 2012 г., 13:35
@ Gokcehan: вы должны учитывать предупреждение. Там'Фактическая ошибка, которая может возникнуть в результате вызоваmalloc без прототипа по объему, и предупреждение является вашей защитой от него.stackoverflow.com/questions/605845/..., Если ваша программа работает, топросто потому что тыНам повезло в отношении деталей соглашения о вызовах в этой реализации - тот же код может не работать при компиляции для Linux на каком-либо другом процессоре.

stdlib.h является стандартным заголовком C, который объявляет, среди прочего, функции malloc (), calloc (), free (). Это заголовок, который вы должны включить.

malloc.h это нестандартный заголовок, встречающийся во многих системах, где он часто определяет дополнительные функции, специфичные для реализации malloc, используемой этой платформой.

Если вы не включите ни одного из них,Нет значения по умолчанию, однако если вы вызываете malloc () без предварительного объявления функции malloc, C будет считать, что прототип функции имеет видint malloc(); , что часто неправильно. В дополнение к заголовкам компиляторы C обычно ссылаются на стандартную библиотеку, например glibc в Linux, где находится реализация malloc.

Обратите внимание, что тамРазница между заголовочными файлами и библиотеками. Заголовочные файлы объявляют такие вещи, как структуры и прототипы функций. Библиотеки содержат реализацию, скомпилированный код. Вы ссылаетесь на библиотеку, и вы #include заголовочные файлы.

Ваш ответ на вопрос