Почему этот код ниже не работает - PullRequest
2 голосов
/ 12 октября 2010
#include <stdio.h>

int *top;
int a=1;
top=&a;

void main()
{
    printf("%d\n",*top);
}
error C2440: 'initializing' : cannot convert from 'int *' to 'int'

ОБНОВЛЕНИЕ

Я знаю, как заставить это работать, но я спрашиваю, почему это НЕ РАБОТАЕТ.

Ответы [ 6 ]

6 голосов
/ 12 октября 2010

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

foo;

объявляет глобальную переменную int с именем foo.Поэтому, когда вы говорите

top = &a;

, он объявляет глобальную переменную int с именем top и пытается инициализировать ее с адресом a.Это дает вам две ошибки, которые вы видите - два конфликтующих объявления для top и невозможность преобразовать int * в int.Конечно, те же самые древние компиляторы Си не дали бы вам вторую ошибку, к счастью преобразовав адрес в int без жалоб.

Это также говорит вам, почему int i; i = 100; работает --- два объявления для iкак глобальная переменная int (что нормально, поскольку они одного типа), а вторая инициализирует ее как 100 (что нормально, поскольку только одно объявление имеет инициализатор)

Есть многоувлекательных вещей в «Деннисе Ричи» Развитие языка Си

4 голосов
/ 12 октября 2010

Я немного удивлен тем точным сообщением об ошибке, которое вы получили по этому поводу, но проблема (или, по крайней мере, одна из очевидных проблем) заключается в том, что вне функции вы можете определять и инициализировать переменные, ноВы не можете выполнять обычное назначение - это должно быть выполнено как часть выполнения функции.Таким образом, ваш top=&a; не разрешен.

Другая проблема состоит в том, что у вас есть main, возвращающий void, где он должен возвращать int (хотя большинство компиляторов примут это даже безпредупреждение, не говоря уже об сообщении об ошибке).

3 голосов
/ 12 октября 2010

На самом деле, из вашего исходного кода:

int *top;
int a=1;
top=&a;

Как уже упоминали другие - в глобальном пространстве вы можете объявить или объявить и инициализировать.Вы не можете выполнять присваивание.

Что действительно происходит в строке top = &a;, так это то, что вы на самом деле повторно объявляете переменную с именем top, и по умолчанию используется тип int.Фактически, компилятор должен предупредить о создании новой переменной с именем top, имя которой совпадает с именем ранее объявленной переменной, а также сгенерировать дополнительное предупреждение о создании переменной по умолчанию типа int.

В C переменные, которые объявлены без типа по умолчанию, равны int, и это приведет к появившейся ошибке.

ошибка C2440: «инициализация»: невозможно преобразовать из'int *' to 'int'

На что это действительно жалуется, так это то, что top = &a;, как в вашем коде на самом деле выглядит как int top = &a; для компилятора, поэтому вы пытаетесь связать int* до int.

1 голос
/ 12 октября 2010

Это работает:

#include <stdio.h>

int *top;
int a=1;
int main()
{
    top=&a;
    printf("%d\n",*top);
}

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

Вы также не упомянули другие ошибки, пожалуйста, укажите все ошибки, иногда одна ошибка основана на другой, и когда одна исправлена, другие исправляются.В данном случае это было:

Конфликтующие типы для 'top'.

0 голосов
/ 12 октября 2010

Другой вариант:

#include <stdio.h>

int a=1;
int *top=&a;

void main()
{
    printf("%d\n",*top);
}
0 голосов
/ 12 октября 2010

Я, честно говоря, понятия не имею, почему это не удается, но это работает:

#include <stdio.h>

int a = 1;
int* top = &a;

void main()
{
    printf("%d\n", *top);
}

И помните: ВСЕГДА ИНИЦИАЛИЗИРУЙТЕ СВОИ УКАЗАТЕЛИ !! Если вы не собираетесь назначать их немедленно, по крайней мере сделайте что-то вроде этого:

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