一、sizeof
32位:
Size of char is: 1
Size of unsigned char is: 1
Size of signed char is: 1
Size of int is: 4
Size of short is: 2
Size of long is: 4
Size of long int is: 4
Size of signed int is: 4
Size of unsigned int is: 4
Size of unsigned long int is: 4
Size of long long int is: 8
Size of unsigned long long is: 8
Size of float is: 4
Size of double is: 8
Size of long double is: 8
Size of (void *) is: 4
Size of (char *) is: 4
Size of (int *) is: 4
Size of (long *) is: 4
Size of (long long *) is: 4
Size of (float *) is: 4
Size of (double *) is: 4
所有指针都是占4字节
64位:
Size of char is: 1
Size of unsigned char is: 1
Size of signed char is: 1
Size of int is: 4
Size of short is: 2
Size of long is: 8
Size of long int is: 8
Size of signed int is: 4
Size of unsigned int is: 4
Size of unsigned long int is: 8
Size of long long int is: 8
Size of unsigned long long is: 8
Size of float is: 4
Size of double is: 8
Size of long double is: 16
Size of (void *) is: 8
Size of (char *) is: 8
Size of (int *) is: 8
Size of (long *) is: 8
Size of (long long *) is: 8
Size of (float *) is: 8
Size of (double *) is: 8
所有指针都是占8字节
在Win32上,指针和int都是32位长,在Win64指针上是64位长,而int还是32位长。
二、memcpy和memcpy_s
0、在使用memcpy, strcpy之类的函数的之前,最好作一个被Copy对象的内存越界检查以确保内存Copy操作不会引起越界问题。比如 memcpy(lpTarget,lpSource,size_t) 就要做三个检查:首先检查lpTarget是否合法,是不是为NULL,有没有指向其他内存区域;其次要看lpSource是否合法;最后检查lpSource可操作内存的长度是否小于Size_t,lpTarget的内存长度是否小于Size_t。这三个检查一个都不能忽略。
1、memcpy会访问越界,破坏了dest后面的数据,并且可能我们还不知道。而memcpy_s就会弹出一个对话框提醒我们。
2、strcpy_s、memcpy_s等具有缓冲区大小检查的函数,可以有效的检测内存溢出,找到出错的代码。但是strcpy、memcpy这样的出错了需要自己扒代码。
3、memcpy 不能使用try catch抓异常
结论是,是cacth不到的。原因是,memcpy是c语言,未进行exception 机制。
try
{
memcpy(bytes, other.bytes, count);
}
catch (...)
{
delete[] bytes;
}
为了避免这种情况的出现,可以使用下面的方法:
__try
{
//访问内存地址0x000006
memcpy(pbDup, (char*)0x000006,1000);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
AfxMessageBox("内存复制出错了");
}
“error C2712: 无法在要求对象展开的函数中使用__try”解决方案
https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement?view=vs-2019