不同顺序的相同声明在gcc中产生不同的结果

Fab*_*iro 2 c file-io

问题在第7行: int ret=3, x, y;

如果我首先声明y(如第8行),结果将是不同的

在我的电脑上现在只打印Y值,声明中的这个更改只打印X的值

Makefile文件

gcc -g -o open_file_test open_file_test.c;
./pen_file_test input
Run Code Online (Sandbox Code Playgroud)

码:

#include <stdio.h>
#include <stdlib.h>

int worldsize = 0;

int main(int argc, char const *argv[]){
    int ret=3, x, y;
    //int ret=3, y, x;
    char chr;
    int teste;

    FILE * inputFile;
    inputFile = fopen(argv[1],"r");
    teste = fscanf(inputFile,"%d", &worldsize);
    printf("Tamanho: %d\n", worldsize);

    while(1){
        ret=fscanf(inputFile,"%d %d %s\n", &x, &y, &chr);
        if(ret != 3)
            break;
        printf("x: %d  y: %d\n", x, y);
    }
    printf("End File :D\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入文件

10
1 0 w
2 1 s
6 9 w
3 7 w
5 0 s
1 5 t
1 5 t
7 5 t
9 7 t
9 3 t
0 0 i
Run Code Online (Sandbox Code Playgroud)

产量

Tamanho: 10
x: 0  y: 0
x: 0  y: 1
x: 0  y: 9
x: 0  y: 7
x: 0  y: 0
x: 0  y: 5
x: 0  y: 5
x: 0  y: 5
x: 0  y: 7
x: 0  y: 3
x: 0  y: 0
End File :D
Run Code Online (Sandbox Code Playgroud)

在我的电脑上只阅读Y,我同事电脑上的相同代码只能读取X,而在另一位朋友的电脑上工作正常(读取X和Y),有人可以解释原因吗?

pad*_*ddy 5

您的代码中有未定义的行为:

fscanf(inputFile,"%d %d %s\n", &x, &y, &chr);
Run Code Online (Sandbox Code Playgroud)

读取一个chr单个char变量的字符串.即使字符串包含单个字符,也会在其后写入空终止符.这可能会溢出到堆栈中的整数.

如果你想要一个char,那么使用%c:

fscanf(inputFile,"%d %d %c\n", &x, &y, &chr);
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢一个字符串,那么创建chr一个char足够大的数组来保存任何潜在的字符串(加上一个空终止符).或者,使用一次fgets读取一行,然后再解析值.