0

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

#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.请建议用于此类情况的可靠方法

4

2 回答 2

1
memcpy(arr1,arr,sizeof(MAX_LEN)); // Leads to Heap Corruption why ?

因为sizeof(MAX_LEN)等于sizeof(20)which 等于sizeof(int)。这意味着您将复制 4 或 8 个字节(取决于您的平台)。然后在fun1你打印数组,就好像它是一个空终止的字符串。但是没有空终止符,因为您没有复制它并且很printf高兴地超出了界限。

sizeof(arr),另一方面,给你正确的大小 20。

sizeof运算符查询您作为操作数而不是值提供的表达式类型的大小。它纯粹是编译时运算符。整数文字的类型20int,它将返回该类型的大小。

于 2013-10-25T11:22:29.957 回答
0

诚实地?如果您用 C++ 编写,只需使用std::vector,通过引用传递它并忘记整个问题。

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

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

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

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

于 2013-10-25T11:23:24.923 回答