sizeof 函数计算时,对于数组起始地址和指向数组的指针,结果是不同的
#include <stdio.h> int love(char *p){ printf("sizeof(p) is:%d ", sizeof(p)); return 0; } int main() { char a[100]; char *l = a; printf("\nsizeof(a) is:%d and sizeof(l) is:%d \n",sizeof(a), sizeof(l)); love(a); }
结果:sizeof(a) is:100 and sizeof(l) is:8
sizeof(p) is:8
所以在一些子函数中不要期望通过指向数组首地址的指针来求得数组的大小,如下偶犯的错误:
int send_osd_message(char* ip_addr, int port, char * message) { CACHE_PRINT("\n%s line:%d start ...\n", __func__, __LINE__); int socket_descriptor; int iter=0; struct sockaddr_in address; assert(sendlen); memset(&address, 0, sizeof(address)); address.sin_family=AF_INET; address.sin_addr.s_addr=inet_addr(ip_addr); address.sin_port=htons(port); socket_descriptor=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); sendto(socket_descriptor,message, sizeof(message),0,(struct sockaddr *)&address,sizeof(address)); close(socket_descriptor); CACHE_PRINT("\nMessage is sent to osd:%s\n", ip_addr); return 0; }
这种情况,即使message指向的数组再大,在64位的机器上也只能发送8个bytes数据。