c - 整数和数组之间的奇怪转换
问题描述
我已将全局变量定义SEIS_FORMAT
为整数。但是我在外部函数中使用的时候,我把它定义为一个数组SEIS_FORMAT[6]
,用 as 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.功能代码:“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
是等价的吗?
解决方案
这几乎可以肯定是未定义的行为,所以一切皆有可能。
至于为什么它似乎工作,链接器对数据类型一无所知,它只知道名称SEIS_FORMAT
指的是特定的内存位置。它由主程序初始化为单个整数,但f1()
随后将该内存位置视为数组的开头。数组的元素0
对应于在主程序中初始化的整数。