函数 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, * - %cn", ch, *ch/*4*/);
                ch++;
       }
       fclose(fp);
       return 0;
}

错误列表:

  1. 函数 main 中的表达式语法
  2. 函数 main 中未定义的符号 'ch'
  3. 在函数主中非法使用指针
  4. 函数主中的间接寻址无效

我认为这一定是某种古老的 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

最新更新