处理数组

Processing Arrays

本文关键字:数组 处理      更新时间:2023-10-16

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

#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 = %sn",arr);    
}     
void func2(U8* arr)
{
 printf(" Passing Pointer address Element1 = %s n",arr);    
}
int main()
{
 U8 arr[MAX_LEN] = "Stack Overflown";
 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++写,只需使用std::vector,通过引用传递它,忘记整个问题。

如果你真的必须使用 C 风格的数组,我会说,在大多数情况下(我的意思是,99.9%),你必须在堆上分配数组,因为程序通常可用的堆栈内存有限,在那里放置数组通常不是一个好主意。

但请记住,常量文本表达式按以下方式定义:

const char * myText = "Alice has a cat";

可能不存储在堆栈上,而是存储在某个地方(取决于编译器C++)。这些不会在堆栈中占据位置,在您的示例中很可能就是这种情况。在此示例中,指向该文本的指针存储在堆栈上,但文本本身(大部分可能)存储在其他位置。