Обработка массивов

Пример, демонстрирующий передачу массива в качестве аргумента

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

0

Решение

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 и он вернет размер этого типа.

1

Другие решения

Честно? Если вы пишете на C ++, просто используйте std::vector, передайте это по ссылке и забудьте обо всей проблеме.

если ты действительно должны использовать массивы в стиле C, я бы сказал, что в большинстве случаев (Я имею в виду, 99,9%), вам придется размещать массив в куче, потому что программы обычно имеют ограниченную доступную память стека, и размещение массива там, как правило, не очень хорошая идея.

Помните, что константные текстовые выражения определены следующим образом:

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

может храниться не в стеке, а где-то (в зависимости от компилятора C ++). Они не будут занимать место в стеке, и, скорее всего, так и есть в вашем примере. В этом примере указатель этот текст хранится в стеке, но сам текст (в основном, вероятно) хранится в другом месте.

0

По вопросам рекламы [email protected]