Пример, демонстрирующий передачу массива в качестве аргумента
#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 ++). Они не будут занимать место в стеке, и, скорее всего, так и есть в вашем примере. В этом примере указатель этот текст хранится в стеке, но сам текст (в основном, вероятно) хранится в другом месте.