2012-01-16 3 views
0

Когда я запускаю это на своем компьютере, я получаю ошибки компиляции. Тем не менее, я скопировал его прямо из учебника, которое я нашел в Интернете.Ошибки при компиляции программы C с указателями

#include <stdio.h> 
#include <conio.h> 

void main(){ 
    int i = 9; 
    clrscr(); 

    printf("The value of i is: %d\n", i); 
    printf("The address of i is: %u\n", &i); 
    printf("The value at the address of i is: %d\n", *(&i)); 

    getch(); 
} 

Ошибки:

$ cc "-Wall" -g ptrex6.c -o ptrex6 
ptrex6.c:7:19: error: conio.h: No such file or directory 
ptrex6.c:9: warning: return type of ‘main’ is not ‘int’ 
ptrex6.c: In function ‘main’: 
ptrex6.c:11: warning: implicit declaration of function ‘clrscr’ 
ptrex6.c:14: warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘int *’ 
ptrex6.c:17: warning: implicit declaration of function ‘getch’ 
make: *** [ptrex6] Error 1 
+16

* Выбросьте учебник * 'аннулируются основной()' не действует C. –

+3

Вы должны прочитать сообщения об ошибках, так как она указывает из многочисленных проблем, к вам: ' main' должен быть объявлен как 'int main()' not 'void main()'; ваш путь включения кажется неправильным, поскольку 'conio.h' не был найден; ваш формат неверен - значение указателя не является неподписанным int ('% u'), вы, вероятно, хотите'% p' вместо этого. – bobbymcr

+1

ConIO - библиотека dos, какую машину вы компилируете? – Kevin

ответ

7

Ошибки:

  1. conio.h не является стандартом C заголовок. Он может быть недоступен в вашей системе. Тем не менее, он не нужен для printf(). Вот почему stdio.h здесь. Удалите его, а также удалите clrscr(). Он не будет работать без библиотек conio. Делая это, вы сможете скомпилировать свой файл, так как другие сообщения являются «просто» предупреждениями, а не ошибками.

  2. Измените свой тип возврата функции int и верните 0. Это то, что указывает стандарт C. Вы хотите это.

  3. Использовать спецификатор формата %d вместо %u. Как прямо указывает сообщение компилятора,% u для целых чисел без знака, а int явно подписан. Для целых чисел> = 2^31 у вас появятся странные проблемы с поведением.

  4. Вы используете неправильный спецификатор еще раз. Используйте %p для адресов/указателей, а не% u /% d/whatever.

  5. Не указывайте/скопируйте вставку из учебников. Учебники не предназначены для копирования, они должны быть учтены и изучены.

+0

Оператор возврата в конце 'main' не является обязательным, поэтому я бы не назвал его ошибкой. – ouah

+0

С тех пор, если вы его не используете, вы привыкнете возвращать void из не-void-функций, и они не будут исправлены компилятором (как crt0, если он не возвращается из main()), и они ** будут терпеть крах. –

+0

Я сделал то, что вы предложили, и изменил getch() на getchar(). Теперь у меня меньше ошибок. – userend

3

Вот как напечатать значение указателя в C:

printf("The address of i is: %p\n", (void *) &i); 
+0

, что не было вопроса - –

2

Как заявил Wikipedia

conio.h заголовочный файл C используется в старой MS-DOS компиляторов для создания текстовых пользовательских интерфейсов. Он не описан в книге программирования C C , и это не является частью стандартной библиотеки C, ISO C и не является , определяемой POSIX.

4

Возможно, вы использовали довольно старую книгу/пример. Файл conio.h использовался в системах MS-DOS. Ваш код должен выглядеть следующим образом:.

#include <stdio.h> 

int main() 
{ 
    int i = 9; 

    printf("The value of i is: %d\n", i); 
    printf("The address of i is: %p\n", (void*)&i); 
} 
+2

'& i' должен быть отправлен на' void * ', иначе это неопределенное поведение. – ouah

+0

Вы правы! Прости пронесся мимо меня. – Mithrandir

+0

Как насчет функции clrscr()? – userend

Смежные вопросы