Впервые впервые в динамической памяти

почему ошибка

#include <stdio.h>

int main(void)
{
    int *p, size, i;
    FILE *fp;

    fp = fopen("input.txt","r");
    fscanf(fp, "%d", &size);

    p = (int*)malloc(size*sizeof(int));  //error
    for (i = 0; i <size; i++)
        fscanf(fp, "%d", &p[i]);

    for (i = size-1; i>= 0; i--)
        printf("%d\n", p[i]);

    free(p);
    fclose(fp);
    return 0;
}

я использую "Geany" на ubuntu

и в компиляторе Geany:

fileName.c: 11: 2: предупреждение неявное объявление функции 'malloc' [-Wimplicit-function-declatation] имя_файла.c: 11: 12: предупреждение: несовместимое неявное объявление встроенной функции 'malloc' [включено по умолчанию] fileName.c: 18: 12: предупреждение: неявное объявление функции 'free' [-Wimplicit-function-декларация] fileName.c: 18: 12: предупреждение: несовместимое неявное объявление встроенной функции 'free' [включено по умолчанию] компиляция успешно завершена


person Alamin    schedule 26.03.2013    source источник
comment
Прекратить преобразование возвращаемого значения malloc. Если вы перестанете это делать, это будет ошибкой, как и должно быть, а не предупреждением. Вам не нужно (и не следует) приводить к или от void* в C. Преобразование является безопасным и неявным.   -  person Ed S.    schedule 27.03.2013
comment
@Mahesh: Это должны быть ошибки, а в C99 они будут ошибками.   -  person Ed S.    schedule 27.03.2013
comment
@EdS. К тому времени как я понял и удалил, вы прокомментировали :)   -  person Mahesh    schedule 27.03.2013
comment
@EdS. - gcc / clang по-прежнему будет предупреждать только в режиме C99 о неявных объявлениях, если вы не укажете -pedantic-errors   -  person teppic    schedule 27.03.2013
comment
Спасибо всем, как я могу скомпилировать с терминала на Ubuntu   -  person Alamin    schedule 27.03.2013
comment
@ Аламин - gcc -o foo foo.c -Wall   -  person teppic    schedule 27.03.2013
comment
@teppic Спасибо, но что c99 -W 64 proble1.c -o problem_1 из ссылки < / а>   -  person Alamin    schedule 27.03.2013
comment
@Alamin, использование c99 вместо gcc в порядке   -  person teppic    schedule 27.03.2013


Ответы (2)


Вам не хватает следующего заголовка:

#include <stdlib.h>

Прототипы для malloc и free определены в stdlib.h файле заголовка, который вы пропустили.

Если вы не уверены, какие файлы заголовков включать для некоторых стандартных функций C, вы всегда можете использовать man, чтобы понять это.

В этом случае man malloc должен был показать требуемый файл заголовка для включения.

Кстати, в вашем коде вы не проверяете, является ли fp NULL после fopen.

fopen может и потерпит неудачу, если файл не существует или у вас нет прав на открытие файла (для чтения в вашем случае).

fp = fopen("input.txt","r");
if (fp == NULL)
{
    printf("Error opening input.txt\n");
    return -1;
}
person Tuxdude    schedule 26.03.2013
comment
Большое спасибо за вашу помощь - person Alamin; 27.03.2013
comment
но в Терминале написано: Ошибка сегментации (дамп ядра) ------------------ (программа завершена с кодом: 139) Нажмите клавишу возврата, чтобы продолжить - person Alamin; 27.03.2013
comment
это потому что я работаю над ubuntu - person Alamin; 27.03.2013
comment
@Alamin - Я обновил ответ, указав вероятную причину ошибки сегментации. Вы должны проверять значение fp после fopen, чтобы убедиться, что это не NULL. В противном случае fscanf пытается читать из NULL файлового указателя. - person Tuxdude; 27.03.2013
comment
Большое спасибо за информативный ответ - person Alamin; 27.03.2013

Этот:

warning implicit declaration of function 'xxxxxx' [-Wimplicit-function-declatation] 

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

Если вы наберете man <function name>, в данном случае man malloc в свой терминал (или в Google), вы получите страницу с информацией о том, какие файлы заголовков вам нужны. В этом случае <stdlib.h> включите его, и предупреждение исчезнет.

person Mike    schedule 26.03.2013
comment
Большое спасибо за информативный ответ - person Alamin; 27.03.2013