cl.exe(32 бита) и cl.exe(64 бита) имеют одинаковую версию, но почему они не эквивалентны?

Это код, написанный студентом-новичком. Я проверяю, является ли его код неправильным или правильным. И я нашел неправильную точку. Это вызвано несоответствием типов параметров и аргументов.

void make_data(FILE *fp,char,int n);

Это прототип функции. Однако он вызвал функцию с другими аргументами. Как это.

make_data(fin, "input.txt", 10);

Неправильный момент очевиден - он объявил прототип функции неправильно. Сначала я скомпилировал этот код с помощью cl.exe(64 бита) и запустил программу. Он был остановлен во время выполнения.

Однако, когда я скомпилировал тот же файл с помощью cl.exe(32 бита), не возникла ошибка во время выполнения. Конечно, было много предупреждений о компиляции, но, по крайней мере, все было выполнено хорошо. Похоже, что cl.exe(32 бита) более терпим, чем 64-битный. Но они имеют одинаковую версию.(16.00.30319.01). Тогда почему они ведут себя по-разному?

Я понимаю, что это неопределенное поведение. Я знаю, что компилятор Visual C может сильно отличаться от gcc - потому что язык C не определяет все детали. Я хочу знать, почему компилятор в 32-битной и 64-битной системах должен быть таким, как этот.

1 ответ

Решение

Код, который вы показываете, является допустимым C. Это бессмысленно, но что касается семантики C, он действителен и не вызывает UB.

Полный пример:

#include <stdio.h>

void make_data(FILE *fp, char a, int n) {
   printf("%p %c %d\n", fp, a, n);
}

int main()
{
   FILE * fin = NULL;
   make_data(fin, "input.txt", 10);
}

Пример вывода:

0x0 2 10

Что вы нам не говорите, так это то, что декларации разные в разных единицах перевода. Например в file1.c, есть void make_data(FILE*, char, int); декларация, а в file2.c есть void make_data(FILE*, char*, int) { ... } определение. В 64-битной системе char а также char* передаются по-другому, и это вызывает сбой.

Итак, повторюсь, проблема в том, что вы не правильно определили проблему - несмотря на то, что она полностью предотвратима, если вы только следовали инструкциям. Пожалуйста, прочитайте и поймите, как задать страницу хорошего вопроса. Это на вас и только на вас, чтобы минимизировать проблему и иметь возможность воспроизвести ее до того, как задавать вопрос.

Другие вопросы по тегам