函数 main (Turbo-C) 中的表达式语法

Expression syntax in function main (Turbo-C)

我正在使用 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. 函数 main
  3. 中的未定义符号 'ch'
  4. 在函数 main 中非法使用指针
  5. 函数 main 中的间接寻址无效

我认为这一定是某种古老的 C,因为我确信这段代码可以在现代编译器上编译。我知道它会产生段错误,因此我在 DOS 环境中编写。

1) 和 2) Turbo-C 使用标准的 C90 版本。它不允许在 { } 主体的中间声明变量,只能在顶部声明。因此 char* ch 必须移动:

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

3) 你尝试乘以一个指针(char *) 209。这在 C 中是不允许的,也不会在现代编译器上编译。

最后,用于不指向已分配对象的指针的指针算术 ch++ 未被任何版本的 C 明确定义。可能 在 Turbo C 中工作,但不能保证。

我认为这个程序应该获取 RAM 的内存转储并将其存储到文本文件中。 MS DOS 允许直接访问内存。然而,该代码早在 1989 年就已经受到质疑。

使用 char 访问原始内存是个坏主意,因为它是一种具有实现定义的符号的类型。请改用 unsigned charuint8_t