Я недостаточно копаюсь, чтобы дать вам ответ, но у меня есть важное предложение: проверьте предупреждения вашего компилятора. Когда мой bash запускается, он псевдонимом gcc
- /usr/bin/gcc -Wall -Wextra -Werror
так что все, что я пытаюсь скомпилировать, должно пройти через некоторые из самых суровых тестов GCC (и все предупреждения воспринимаются как ошибки, поэтому незначительные ошибки не будут компилироваться). Ваш код дал мне распечатку ошибки длиной в милю (не буквально). Некоторые ошибки:
printf()
имеет специальный спецификатор формата для указателей: %p
. Не используйте %d
- это для int
с.
p
- это int *
(указатель на int
), "hello world"
- это char *
. Вы можете назначить одно другому, но обычно это плохая идея, поэтому если вы действительно хотите сделать это, вы должны использовать приведение, чтобы сказать: "Эй, я хотел это сделать:" p = (int *) "hello world";
main()
не возвращает void
, возвращает int
. Вы знаете это, потому что вы объявили int main(void)
хорошим программистом, но затем мы подходим к концу main()
, и нет заявления return
! Как это должно вернуть int
, если вы ничего не return
? В C ++ мы можем пропустить завершающий оператор return
, но не в C (по крайней мере, мы действительно не должны этого делать, потому что могут случиться плохие вещи).
Кроме того, у вас есть шаблон, который вы часто повторяете:
k = 0;
while (k < 10) {
y[k] = k;
k = k + 1;
}
Добро пожаловать в for
петли:
for(k = 0; k < 10; k++) {
y[k] = k;
}
for()
петли состоят из трех частей:
for(init; cond; inc)
init
выполняется один раз перед циклом, затем цикл выполняется до тех пор, пока cond
имеет значение true, выполняя inc
в конце каждого цикла. Это почти точно соответствует тому, что вы делаете, и более кратко.