演示将数组作为参数传递的示例
#include <iostream>
#include <malloc.h>
using namespace std;
typedef unsigned char U8;
#define MAX_LEN 20
void func1(U8* arr)
{
printf(" Passing Base address Element1 = %s\n",arr);
}
void func2(U8* arr)
{
printf(" Passing Pointer address Element1 = %s \n",arr);
}
int main()
{
U8 arr[MAX_LEN] = "Stack Overflow\n";
U8* arr1 = (U8*)malloc(sizeof(MAX_LEN));
func1(arr); /* Passing Base address */
memcpy(arr1,arr,sizeof(arr));
/*
memcpy(arr1,arr,sizeof(MAX_LEN)); Leads to Heap Corruption why ?
*/
func2(arr1);/* Passing pointer */
free(arr1);
cout << "Array Freed" << endl;
cin.get();
return 0;
}
查询: 1.考虑到数据处理,这是最佳实践。[堆栈或堆上的数据] 2. 请建议用于此类情况的可靠方法
最佳答案
memcpy(arr1,arr,sizeof(MAX_LEN)); // Leads to Heap Corruption why ?
因为 sizeof(MAX_LEN)
等价于 sizeof(20)
等价于 sizeof(int)
。
这意味着您将复制 4 或 8 个字节(取决于您的平台)。然后在 fun1
中打印数组,就好像它是一个空终止字符串一样。但是没有空终止符,因为您没有复制它并且 printf
很高兴地超出了界限。
sizeof(arr)
,另一方面,给你正确的大小 20。
sizeof
运算符查询您给它作为操作数的表达式类型 的大小,而不是值。它纯粹是编译时运算符。整型文字 20
的类型是 int
,它将返回该类型的大小。
关于c++ - 处理数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19588334/