2015-10-22 2 views
-1

В следующем цикле я пытаюсь скопировать данные, хранящиеся по адресу voidPtr. Известно, что данные представляют собой целочисленный массив длины. Я прочитал, что приведение этого массива в int, а затем выполнение копии (как показано ниже) должно работать.Копирование массива, хранящегося в указателе Void, в Int Array

int intArr[count]; 
    for (int i = 0; i<count; i++){ 
    intArr[i] = ((int*) voidPtr)[i]; 
    } 

Однако, когда я пытаюсь напечатать массив int int, я получаю seg-fault.

for (int i = 0; i<count; i++){ 
    printf("%d ", intArr[i]); 
    } 

Любые идеи?

+2

Во-первых, вы должны просто «memcpy (intArr, voidPtr, count * sizeof (int));' для копии (это проще и эффективнее). Во-вторых, не могли бы вы разместить больше кода. То, что вы показали, похоже, не содержит конкретных ошибок. – 865719

+0

Как уже упоминалось в @ 865719, вам необходимо предоставить полный пример, который показывает проблему. Приведенный выше код будет работать, если все ваши предположения верны (для которых вы не предоставили код). [Здесь] (http://cpp.sh/8aqh) - пример. Вы также можете пересмотреть свой дизайн, поскольку использование 'void *' для передачи других типов не является хорошей практикой проектирования и может легко вызвать у вас проблемы. – crayzeewulf

+0

@ 865719, используя malloc и memcpy, разрешил проблему. Я предполагаю, что размер контейнера, который я создал, не был достаточно большим. Огромное спасибо за предложение, и я постараюсь быть немного более основательным в будущих постах. – mongolol

ответ

0

Вы делаете неправильные вещи, и, когда компилятор предупреждает вас, вы просто запираете его литой. Нет, ты стреляешь в ногу, а кто виноват? :)

Вы сделали это, чтобы сказать, что voidPtr теперь становится int *, и, пожалуйста, обращайтесь к его элементу i. Это не может быть правильно. Скорее всего, в вашей системе void * не совпадает с int *, поэтому при таком нажатии вы будете обращаться к неправильным элементам. Кроме того, ваш void *, похоже, не указывает на достаточно большое место - это то, что вызывает крушение.

Не используйте void * в C++, не выполняйте заливку.

+1

Вы, кажется, смущены. – haccks

+0

Я не. OP есть. Я сделал некоторые предположения о природе этого voidPtr - это определение не было предоставлено. – SergeyA

Смежные вопросы