Пример, демонстрирующий передачу массива в качестве аргумента
#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++, просто используйте std::vector
, передайте его по ссылке и забудьте о всей проблеме.
Если вам действительно нужно использовать массивы C-стиля, я бы сказал, что в большинстве случаев (я имею в виду 99,9%) вам придется выделять массив в куче, поскольку в программах обычно имеется ограниченная доступная память стека и размещение массив, как правило, не очень хорошая идея.
Помните, хотя это постоянное текстовое выражение определяется следующим образом:
const char * myText = "Alice has a cat";
может не храниться в стеке, но где-то (в зависимости от компилятора C++). Они не будут занимать место в стеке и, скорее всего, это в вашем примере. В этом примере указатель на этот текст хранится в стеке, но сам текст (в основном, вероятно) хранится в другом месте.
<malloc.h>
. Это не то, что вы думаете.