странный переход между целым числом и массивом - PullRequest
0 голосов
/ 31 января 2019

Я определил глобальную переменную SEIS_FORMAT как целое число.Но когда я использую его во внешней функции, я определяю его как массив SEIS_FORMAT[6] и использую его как SEIS_FORMAT[0] следующим образом:

1.MAIN () код:

#include "head.h"

int SEIS_FORMAT=5; /*global variable*/

int main() 
{ 
   int a=2;
   float b=3.5;
   f1(&a, &b); 
   return 0; 
} 

код 2.function: "f1.c"

#include "head.h"

void f1(int *a, float *b)
{
  extern int SEIS_FORMAT[6];  //different from the main()
  printf("a=%d,b=%f,c=%d\n",*a,*b,SEIS_FORMAT[0]); //notice the use of SEIS_FORMAT
}

Почему я всегда могу получить правильный ответ: a=2,b=3.500000,c=5?Определения SEIS_FORMAT эквивалентны друг другу?

1 Ответ

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

Это почти наверняка неопределенное поведение, поэтому все возможно.

Что касается того, почему это работает, компоновщик ничего не знает о типах данных, он просто знает, что имя SEIS_FORMAT относитсяв определенную область памяти.Он инициализируется основной программой как одно целое число, но f1() затем обрабатывает эту область памяти как начало массива.Элемент 0 массива соответствует целому числу, которое было инициализировано в основной программе.

...