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

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

  • 0
    Не используйте <malloc.h> . Это не то, что вы думаете.
  • 0
    Обычно не рекомендуется смешивать c с c ++.
Показать ещё 4 комментария
Теги:
arrays
pointers
heap-dump

2 ответа

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

  • 0
    Привет джрок !! Спасибо за ваш комментарий !! Сейчас я немного смущен !! Пожалуйста, ответьте на это. Когда я объявляю макрос его расширенным ритмом, когда я пишу sizeof (MAX_LEN), это должно быть sizeof (20). я прав .. тогда почему он имеет размер 4. И как мой массив U8 ... 1 байт, что неправильно? Я проверил это в моем компиляторе: это удивительно .. Вывод printf ("Arr Len =% d", sizeof (arr)); printf ("Max Len =% d", sizeof (MAX_LEN)); Арр Лен = 20 Макс Лен = 4
  • 0
    @PragRao Проверьте ответ редактирования.
0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню