Зачем включать stdlib.h? - PullRequest
4 голосов
/ 17 июля 2011

Функция malloc () определена в stdlib.h. Она должна выдавать ошибку, если мы не включаем этот файл, но этот код работает нормально с небольшим предупреждениемМой вопрос: если malloc () работает без этого заголовочного файла, то зачем его включать?Пожалуйста, очистите мои концепции.

# include <stdio.h>

int main()  
{
    int a, b, *p;
    p = (int*)malloc(sizeof(int)*5);
    for(a=0;a<5;a++)p[a]=a*9;
    for(b=0;b<5;b++)printf("%d ",p[b]); 
}

Ответы [ 5 ]

11 голосов
/ 17 июля 2011

К сожалению, в Си вам не требуется предварительное объявление для функций.Если компилятор сталкивается с новой функцией, он создаст для нее неявное объявление («mmm`kay, это так, как он используется, поэтому я буду предполагать, что тип аргументов ..»).

Doне полагайтесь на эту «особенность» и вообще не пишите код, который компилируется с предупреждениями.

4 голосов
/ 17 июля 2011

Прочитайте предупреждение.Это говорит, что это недействительно.Компилятор просто слишком добр к вам.В Clang это работает, но может не сработать в других компиляторах.

По крайней мере, включите его для подавления предупреждения.Ненужные предупреждения раздражают.Любая программа должна компилироваться с предупреждениями, которые рассматриваются как ошибки (я всегда это включаю).

3 голосов
/ 17 июля 2011

Похоже, это волшебство вашего компилятора.Отсутствие необходимых заголовков может работать на вашем компиляторе (который, я полагаю, принадлежит Microsoft), но он не обязательно будет компилироваться в другом месте (включая будущие версии того же компилятора).Написать стандартный, переносимый код.

2 голосов
/ 17 июля 2011

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

Например, если вы хотите отобразить сообщение в конце выполнения вашей программы, вынужно будет перейти к функции getch (), эта функция читает символ с клавиатуры, давая пользователю время на чтение отображаемой информации.

Функция getch () требует, чтобы заголовок stdlib был включен.

2 голосов
/ 17 июля 2011

Как и многие вещи в c, причина того, что ошибка не генерируется, когда нет прототипа, по историческим причинам.В первые дни люди часто не беспокоились о функциях создания прототипов, потому что указатели и целые числа обычно были одинакового размера, а целочисленные типы, меньшие, чем целое число, переводились в целое число при передаче в качестве параметра (а плавающая точка редко использовалась для системного программирования).

Если бы в какой-то момент они изменили компилятор для выдачи ошибки, если бы функция не была прототипирована, то это сломало бы многие программы и не получило бы широкого распространения.

С 64-битной адресациейСейчас мы входим в период, когда целые числа и указатели имеют разный размер, и программы, скорее всего, прервутся, если вы не создадите прототип функций, таких как malloc (), которые возвращают указатель.

В gcc всегда устанавливайте следующие параметры дляваши собственные программы: -Werror -Wstrict-prototypes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...