C/C++中32位和64位的sizeof()和memcpy()的区别

一、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

发布了455 篇原创文章 · 获赞 535 · 访问量 324万+

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/103999235
今日推荐