这2个问题其实之前一直知道~~但是就是因为不在意而导致了错误的发生~~

先贴两端代码~~

代码
#include <stdio.h>
#pragma pack(push,1)

struct A
{
// 32Bits
unsigned short wMantleResId:8;
unsigned
short byMantleChangeColorScheme:8;
unsigned
short wWindResId :8;
unsigned
short byWindChangeColorScheme:8;
};

#pragma pack(pop)

int main()
{
printf(
"%d",sizeof(struct A));
return 0;
}

 

 

#include <stdio.h>


int main()
{
int a[5] ={1,2,3,4,5};
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)((int)a + 1);
printf(
"%x\t%x\n",ptr1[-1],ptr2[1]);
return 0;
}

 

第一段代码~~~都是以1为字节长度进行按位分配~~

 

可以看出是协议头~~

但是在本机上调试是没有问题的~因为本机的虚拟服务器环境还是windows~~

可是当进行真机调试的时候~问题就出现了~~

gcc下按位分配对按位分配前的类型不做限制的~只要按位分配的长度不大于类型长度就行~

但是vc下却会对类型进行检查,如果按位分配的前后两个变量的类型不同~vc则会对这两个变量按类型进行分配空间~

所以vc下的长度就会比gcc下的长度多出2个字节~也导致了客户端和服务器之间的通信失败~~

 

第二段代码~~第一个答案是5~当我单步调试的时候~~发现ptr1的类型是 int[5]的指针~~所以ptr1+1就会加上4*sizeof(int)的长度~

但是如果把a作为函数参数传进去~无论参数是int arr[5]还是int arr[]还是int *arr,数组a的长度都会消失,直接退化为int*~~

所以~~数组在参数传递时,都退化为了指针形式~~这也是很多内存拷贝或者字符串拷贝函数后必须有长度的参数的原因了~

这个问题之前就明白~就是因为没有留意,才会导致了一个函数中间的错误~~

 

今天把这个错误写到这里~~铭记自己~~以后就不会犯这样的错误~~

人都是在错误中成长的~