C与C++指针、数组及标准库深度解析
1. 标准C中的指针与数组
在标准C里,指针是一个变量,其值指向内存中的某个位置。但标准C的问题在于,这个内存位置并不与特定类型关联,而是由指针类型本身来定义其所指向内存的类型。
int main(void)
{
int i;
int *p = &i;
}
在上述示例中,我们创建了一个整数 i
,接着创建了一个指针 p
并让它指向 i
。不过,我们还能这样操作:
int main(void)
{
int i;
void *p = &i;
int *int_p = p;
float *float_p = p;
}
此程序中,我们创建了一个指向整数的指针,但将其类型定义为 void *
,这告知编译器我们创建的是一个无类型指针。随后,我们又创建了两个额外的指针,一个指向整数,另一个指向浮点数,这两个指针都用之前创建的 void *
指针进行初始化。
这里存在问题,标准C编译器会进行自动类型转换,将 void *
转换为整数指针和浮点数指针。若同时使用这两个指针,可能会以以下几种方式导致数据损坏:
- 依据不同架构,可能会发生缓冲区溢出,因为整数可能比浮点数大,反之亦然,这取决于所使用的CPU。