sizeof

UDP TCP 消息边界

可紊 提交于 2020-03-14 06:16:05
先明确一个问题,如果定义了一个数据结构,大小是,比方说 32 个字节,然后 UDP 客户端连续向服务端发了两个包。现在假设这两个包都已经到达了服务器,那么服务端调用 recvfrom 来接收数据,并且缓冲区开得远大于 64,例如,开了 1024 个字节,那么,服务端的 recvfrom 函数是会一次收到两个数据包呢,还是只能收到一个。 答案是只能收到一个。 来看代码: struct.h #ifndef STRUCT_H #define STRUCT_H typedef struct _UDP_MSG { int add1; int add2; int sum; char str1[16]; char str2[16]; char cat[32]; } UDP_MSG; #endif /* STRUCT_H */ 服务器的代码: #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include "struct.h" #define MAX_LINE 1024 #define SERV_PORT 8080 int udp_serv();

sizeof和strlen小结

瘦欲@ 提交于 2020-03-14 04:16:58
sizeof和strlen小结 写在前面 之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处,但有了这种理解,或许会对以后的编码有帮助。 sizeof sizeof是一种操作符,它的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位是字节。sizeof表达式的结果是 编译时常量 。具体有以下三种用法: sizeof(类型名) sizeof(表达式) sizeof 表达式 使用sizeof操作符时,其结果部分地依赖所涉及的类型: 1、对char类型或值为char类型的表达式做sizeof操作保证得1; 2、对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小; 3、对指针做sizeof操作将返回存放指针所需的内存大小 4、对数组做sizeof操作等效于将其元素做sizeof操作的结果乘上数组元素的个数。 需要注意的是,sizeof不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来! 其返回值类型为size_t,在头文件stddef.h中定义。 sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如: char ary[sizeof(int)*10];//ok sizeof(

笔记strlen() ,sizeof(),strcpy(),strncpy(),strcat()

依然范特西╮ 提交于 2020-03-13 12:47:18
strlen函数的意思是测试字符串的字符长度,不含字符串结束标志的。 int strlen( const char *str) { assert(str != NULL); int len; while((*str++) != '\0') { len++; } return len; } sizeof是运算符,它的结果是字符串在内存中的所占字节大小,它要把\0算进去的。 strcpy函数原型 ( strcpy(s1,s2); strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy ) char *strcpy(char *strDest, const char *strSrc)//strDest为目标,strSrc为源 { assert((strDest!=NULL) && (strSrc !=NULL)); //如果两个为空则不用复制,直接中止 char *address = strDest; //用address指向strDest开始地址 while( (*strDest++ = * strSrc++) != ‘\0’ ) //复制,直到源串结束; NULL ; //空操作 return address ; //返回strDest开始地址 } } strncpy函数 : 利用标准库函数strncpy(),可以

c 的陷阱

你说的曾经没有我的故事 提交于 2020-03-12 22:22:13
c语言算是非常古老了,像瑞士军刀灵活却也很容易伤到自己,即使是多年的老杆子,以致于市面上都有一本经典的C的书叫《C陷阱与缺陷》的书。 这个文章总结下c中常见的陷阱,可能在日常工作或面试题目中遇到。 1. sizeof 陷阱 sizeof 它是一个编译时运算符而非函数,用于判断变量或数据类型的字节大小。 比较常见的用法: int arr[] = { 1, 2, 3 }; for (int i = 0; i < sizeof(arr) / sizeof(int); i++) { printf("%d,", arr[i]); } sizeof(arr)的是整个数组的占字节数大小,除int占字节大小就是整个数组的大小了,但是如果不小心这样用了: void clear(char array[]) { int i; for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) { array[i] = 0x00; } } int main(void) { char arr[20]; clear(arr); } 问题: 这段代码的问题,在于clear中传递的是指针,这时候sizeof(char*) 一般为4,sizeof(array[0]),造成了结果是只对数组的前四个变量赋值为0,其他的没有赋值! 2. 小心无符号类型 先看段代码:

《深度探索C++对象模型》第三章:Data 语意学

ぃ、小莉子 提交于 2020-03-12 11:22:57
sizeof 内存对齐的一些规则: #pragma pack(n) 预编译指令,可用来设置多少个字节对齐,n的缺省数值是按照编译器自身设置,一般为8,合法的数值分别是1、2、4、8、16,其它的无效。 offset从0开始,每个数据成员开始存放的offset值为min(n, 数据成员大小)的整数倍。 在数据成员完成各自的存放之后,整个类也将进行内存对齐,其大小为min(n, 整个类中最大成员的大小)的整数倍。 如果一个类是空类,即里面无任何数据成员,那么它会有一个隐藏的1 byte 大小,那是被编译器安插进去的一个char,这使得两个objects得以在内存中配置独一无二的地址。 sizeof的大小受到三个因素的影响: 语言本身所造成的额外负担(vptr、vbptr(有些编译器有,也有可能会共用vptr)) 编译器对于特殊情况所提供的优化处理(如空类) 内存对齐的限制 class X {}; class Y : public virtual X {}; class Z : public virtual X {}; class A : public Y, public Z {}; int main() { cout << sizeof(X) << endl; //1 cout << sizeof(Y) << endl; //4 cout << sizeof(A) << endl; /

C/C++中如何获取数组的长度?

99封情书 提交于 2020-03-11 21:44:01
C、C++中没有提供 直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方法是使 用sizeof(array) / sizeof(array[0]), 在C语言中习惯上在 使用时都把它定义成一个宏,比如#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));} 。而在C++中则可以使用模板 技术定义一个函数,比如: template <class T> int getArrayLen(T& array) { return (sizeof(array) / sizeof(array[0])); } 这样对于不同类型的数 组都可以使用这个宏或者这个函数来获取数组的长度了。以下是两个Demo程序,一个C语言的,一个C++的: P.S:若数组为存储 字符串的字符数组,则所求得的长度还需要减一,即对于宏定义: #define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]) - 1 );} ,对于函数定义: template <class T> int getArrayLen(T& array) { return (sizeof

C++.子窗口

烈酒焚心 提交于 2020-03-11 19:57:07
#include <vector> BOOL TraversalChildWnd(OUT std::vector<HWND> &vec, IN HWND hParent) { vec.clear(); try { HWND hEnumWnd = GetWindow(hParent, GW_CHILD); while (hEnumWnd) { vec.push_back(hEnumWnd); hEnumWnd = GetNextWindow(hEnumWnd, GW_HWNDNEXT); } } catch (...) { OutputDebugStringA(__FUNCTION__); } return vec.size() > 0; } int main() { std::vector<HWND> vec; std::cout << TraversalChildWnd(vec, (HWND)0x003605A4) << endl; TCHAR sz[MAX_PATH] = { 0 }; DWORD dwPid = 0; for each (HWND var in vec) { printf("窗口%08X", var); GetWindowThreadProcessId(var, &dwPid); printf(" 进程%08X|%d", dwPid, dwPid); :

const、define与sizeof

风格不统一 提交于 2020-03-11 05:27:17
一.const的用途 1.定义const常量 2.可以修饰函数的形参,返回值,以及函数体。被const修饰的内容可以受到强制保护,防止被意外修改,提高程序健壮性。 const 返回值 函数返回值为 const 只有用在函数返回为引用的情况。 函数返回值引用常量表示不能将函数调用表达式作为左值使用。例如前面讲的返回引用的函数 min( )。 int & min ( int &i, int &j); 可以对函数调用进行赋值,因为它返回的是左值:min ( a , b )=4; 但是,如果对函数的返回值限定为 const 的:const int & min ( int & i, int &j ); 那么,就不能对 min ( a, b ) 调用进行赋值了。 二.const与define的不同 1.const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者没有类型安全检查,只有字符替换,并且在字符替换过程中可能产生意想不到的错误(边际效应) 2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试 三.在类数据成员前用mutable修饰,就可以在const函数中对其进行修改(可应用于对某些特殊成员变量进行修改,而大多数成员变量禁止被修改的情景) 四.sizeof 定义 :判断数据类型在内存中所占用的字节数 注意 : 当数据类型为指针时

C++类的大小计算汇总

≯℡__Kan透↙ 提交于 2020-03-11 03:59:33
  C++中类涉及到虚函数成员、静态成员、虚继承、多继承、空类等。   类,作为一种类型定义,是没有大小可言的。   类的大小,指的是类的对象所占的大小。因此,用sizeof对一个类型名操作,得到的是具有该类型实体的大小。 类大小的计算,遵循结构体的对齐原则; 类的大小,与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常量数据成员,均对类的大小无影响; 虚函数对类的大小有影响,是因为虚函数表指针带来的影响; 虚继承对类的大小有影响,是因为虚基表指针带来的影响; 静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区; 空类的大小( 类的大小为1 ),以及含有虚函数,虚继承,多继承是特殊情况; 计算涉及到内置类型的大小,以下所述结果是在64位gcc编译器下得到(int大小为4,指针大小为8); 一、简单情况的计算 #include<iostream> using namespace std; class base { public: base()=default; ~base()=default; private: static int a; int b; char c; }; int main() { base obj; cout<<sizeof

C语言笔记(十七)——sizeof()、strlen()与str.length()

╄→尐↘猪︶ㄣ 提交于 2020-03-10 12:20:22
求数组长度: 1、sizeof()关键字: 根据sizeof ()关键字可以获得参数(数组、指针、 数据类型、对象或者函数 )在内存中 所占的字节数 ,所以数组所占总的字节数除以一个元素所占的字节数就是数组的长度。如下代码所示,数组 a 是 int 型的,每个元素占 4 字节,所以长度为 10 的数组在内存中所占的字节数就是 40。而总的字节数除以一个元素所占的字节数就是数组的长度,如下面这个程序: # include <stdio.h> int main() { int a[10] = {0, 3, 5, 6, 9}; int cnt = sizeof(a) / sizeof(int); printf("cnt = %d\n", cnt); return 0; } 运行结果: 注意1 :在 给出数组大小 后,sizeof 求 出的是 数组的总长度 ,而不是数组中存放的 有意义的数据 的个数 。 可以采用 不给数组大小 的方法来避免这个问题,比如下例中的数组b: # include <stdio.h> int main() { int a[10] = {0, 3, 5, 6, 9}; int b[] = {1,3,5,4}; int cnt = sizeof(a) / sizeof(int); int cnt1 = sizeof(b) / sizeof(int); printf(