Синтаксис выражения в функции main (Turbo-C) - PullRequest
0 голосов
/ 17 января 2019

Я использую виртуальную машину DOS для обхода ошибки, но Turbo-C не хочет компилировать этот код:

#include <stdio.h>

int main() {
       FILE *fp = fopen("somefile.txt", "w");
       if(fp == NULL) {
               fprintf(stderr, "NaF");
               return -1;
       }
       char /*1*/ *ch = NULL;
       while(ch /*2*/ < (char *) 209* /*3*/1024) {
                fprintf(fp, "& - %p, * - %c\n", ch, *ch/*4*/);
                ch++;
       }
       fclose(fp);
       return 0;
}

Список ошибок:

  1. Синтаксис выражения в функции main
  2. Неопределенный символ 'ch' в функции main
  3. Незаконное использование указателя в функции main
  4. Неверное косвенное обращение в функции main

Я предполагаю, что это должен быть какой-то древний Си, потому что я уверен, что этот код будет компилироваться на современном компиляторе. Я знаю, что это приведет к segfault, поэтому я пишу в среде DOS.

1 Ответ

0 голосов
/ 17 января 2019

1) и 2) Turbo-C использовал версию стандарта C90. Он не разрешал объявления переменных в середине тела { }, но только в верхней части. Поэтому char* ch должен быть перемещен:

int main (void)
{
  char* ch = NULL
  ...

3) Вы пытаетесь умножить указатель (char *) 209. Это просто не разрешено в C и не будет компилироваться на современных компиляторах.

И, наконец, арифметика указателей ch++, используемая для указателя, который не указывает на выделенный объект, не очень хорошо определена ни в одной версии C. Это , вероятно, работало в Turbo C, но без гарантий.

Я думаю, что эта программа должна была получить дамп оперативной памяти и сохранить его в текстовом файле. MS DOS разрешил прямой доступ к памяти. Однако код был сомнительным еще в 1989 году.

Использование char для доступа к необработанной памяти - плохая идея, так как это тип с подписью, определенной реализацией. Вместо этого используйте unsigned char или uint8_t.

...