@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Зачем gcc просит подключить stdlib.h?

#include <stdio.h>
//#include <stdlib.h>
void print(int *p){
	for(int i = 0; i < 10; i++)
		printf("%i ", *(p+i));
}

int main(){
	int *p = malloc(45);
	for(int i = 0; i < 10; i++)
		*(p+i) = i*i;
	print(p);
	return 0;
}


$gcc ./main.c
./main.c: In function ‘main’:
./main.c:9:11: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
int *p = malloc(45);
^
./main.c:9:11: warning: incompatible implicit declaration of built-in function ‘malloc’
./main.c:9:11: note: include ‘ stdlib.h ’ or provide a declaration of ‘malloc’

Но при этом все работает:
$ ./a.out
0 1 4 9 16 25 36 49 64 81
  • Вопрос задан
  • 1609 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Mercury13
Программист на «си с крестами» и не только
Раз у вас stdlib.h закомментирован, вы, наверно, знаете, откуда malloc взялся. Попробуем раскрутить ошибки.

note: include ‘ stdlib.h ’ or provide a declaration of ‘malloc’
Компилятор, очевидно, знает, где этот malloc завалялся…

warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
…но неявно объявляет функцию.

warning: incompatible implicit declaration of built-in function ‘malloc’
Неявное определение int* malloc(int). Реальное void* malloc(size_t). Преобразовать (int*)malloc надо было.

Почему всё-таки запустилось? А потому, что на целевой машине size_t = unsigned int, а размеры указателей совпадают практически всегда. После того, как функция неявно объявилась, линкер подцепил на её место стандартную, и соглашения вызова совпали.
Ответ написан
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
./main.c:9:11: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]

Вы используете функцию malloc(), которая объявлена в stdlib.h. Ошибку-то не пробовали почитать?
Ответ написан
dio4
@dio4
team leader, system engineer, master of sports
#include <stdio.h>
#include <stdlib.h>

void print(int *p){
  for(int i = 0; i < 10; i++)
    printf("%i ", *(p+i));
}

int main(){
  int i,  *p = (int *) malloc(sizeof(int) * 45);
  for(i = 0; i < 10; i++)
    *(p+i) = i*i;
  print(p);
  printf("%c", '\n');
  return 0;
}
/*
Вывод в консоли
$ gcc  -Wall malloc.c -o malloc
$ ./malloc
0 1 4 9 16 25 36 49 64 81 
*/
/*
И чтобы выучил матчасть!
Прототип malloc() 
void *malloc(size_t size);
*/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы