c++ - 处理数组

标签 c++ c arrays pointers heap-dump

演示将数组作为参数传递的示例

#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/

相关文章:

c - 为什么这个 if 语句不起作用?

delphi - 对数组进行排序的最佳方法

arrays - 创建一个函数来迭代和循环 Swift 中的数组

c++ - 如何使用 C++/WinRT 和 ANGLE 创建 EGLSurface?

c++ - Allegro5 al_create_display() 在 Mac OS Catalina 上崩溃

c++ - 我可以在函数内执行 "variable statements"而没有定义吗?

c - 从函数 C 修改全局字符串数组

c++ - 使用默认构造函数从类中调用对象

c - 库代码内存占用分析

Javascript 字符串到数组/字典