处理数组
Processing Arrays
演示如何将数组作为参数传递的示例
#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++)。这些不会在堆栈中占据位置,在您的示例中很可能就是这种情况。在此示例中,指向该文本的指针存储在堆栈上,但文本本身(大部分可能)存储在其他位置。
相关文章:
- 使用对象数组对 SFML 进行动画处理
- 如何像在 C++ 中处理数组一样对 .txt 文件中的字符进行寻址?
- 有人可以解释一下吗?这是关于数组和数组内部 if 语句的一些处理
- 我如何处理有关输入的字符串大小超过字符数组设置大小的错误?
- 处理数组时make_unique和make_shared之间的差异
- 如何以这种方式处理字符串数组
- 数组 C++ 上的异常处理程序
- 为什么我的代码无法处理大型数组输入(>10000)?
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- 我如何处理数组的单个元素
- 如何在 c++ 预处理器宏中处理数组元素?
- 异常 尝试初始化动态数组时未处理
- 返回处理数组的INT功能
- 处理另一个类中类动态分配的对象数组
- 与IDE/编译器数组处理的差异
- 使用无符号字符数组处理单个字节
- 字符数组 - 处理内存
- C++数组处理
- 并行数组处理C++