2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C++ возврат указателя
Сообщение21.12.2012, 21:54 


11/06/12
20
Итак, есть простенькая функция для аллокации памяти:
Код:
void* allocate(unsigned int size) {
   return = malloc(size);

Этот простой код должен возвращать указатель на блок памяти выделенный функцией malloc, но она не работает!
Код компилируется, но при запуске программы она падает. Дебаг в эклипсе показал что проблема именно в этой функции - при выполнении следующего кода
Код:
void *v = allocate(8);

В переменной v вместо адреса оказывалось вот это:
v Error: Multiple errors reported.\ Failed to execute MI command: -var-create - * v Error message from debugger back end: Attempt to dereference a generic pointer.\ Unable to create variable object

Изменяем код функции:
Код:
void* allocate(unsigned int size) {
char *c = (char*)malloc(size);
return (void*)c;

Значение указателя c представляет собой валидный адрес, но при конвертации в обычный указатель он портится.
Почему так происходит? Ведь стандартная функция malloc спокойно возвращает void*. И как надо переписать функцию, чтобы она нормально работала?

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:21 
Заслуженный участник


04/05/09
4587
Mr Alexey в сообщении #661602 писал(а):
Итак, есть простенькая функция для аллокации памяти:
Код:
void* allocate(unsigned int size) {
   return = malloc(size);

Этот простой код должен возвращать указатель на блок памяти выделенный функцией malloc, но она не работает!
Код компилируется
Не может быть. В этом коде синтаксическая ошибка.

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:25 


11/06/12
20
venco в сообщении #661631 писал(а):
Не может быть. В этом коде синтаксическая ошибка.

Ошибся когда набирал сообщение.
Код:
void* allocate(unsigned int size) {
return malloc(size);

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:26 
Заслуженный участник


04/05/09
4587
Mr Alexey в сообщении #661602 писал(а):
[i]v Error: Multiple errors reported.\ Failed to execute MI command: -var-create - * v Error message from debugger back end: Attempt to dereference a generic pointer.\ Unable to create variable object
А это вообще сообщение отладчика, а не программы. Возможно, вам надо обновить его.

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:34 


11/06/12
20
venco в сообщении #661635 писал(а):
А это вообще сообщение отладчика, а не программы. Возможно, вам надо обновить его.

Ошибка в отладчике не объясняет почему скомпилированная программа падает. Компилирую через мингв, сомневаюсь что проблема в нем.

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:49 
Заслуженный участник


04/05/09
4587
Mr Alexey в сообщении #661602 писал(а):
Дебаг в эклипсе показал что проблема именно в этой функции
Вывод неверный. У вас упал отладчик, и проблема, скорее всего, в нём. А где именно ошибка в самой программе - пока не ясно, по крайней мере мне, т.к. вы привели код только одной функции, да и то с опечатками. Хинт: чтобы не было опечаток, лучше не набирать код заново, а скопировать из программы.

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:54 


11/06/12
20
Код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void* allocate(unsigned int size) {
   return allocate(size);
}

int main() {
   void *n = allocate(8);
   return 0;
}


venco в сообщении #661642 писал(а):
Вывод неверный. У вас упал отладчик, и проблема, скорее всего, в нём.

Ошибка обнаруживается не только в дебагере, при запуске экзешника винда сообщает о прекращении программы.

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение22.12.2012, 00:04 
Заслуженный участник


28/04/09
1933
Рекурсия. См. рекурсия. Так где вызов malloc-то?

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение22.12.2012, 00:39 


11/06/12
20
Код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void *allocate(unsigned int size) {
   void *n = malloc(size);
   return n;
}

int main() {
   void *v = allocate(8);
   return 0;
}


Так, теперь код работает как надо, без вылетов, ошибка допустил в другом месте. Однако при установке брейкпоинта в стоку return n; вместо значения n в отладчике по прежнему multiple errors.

 Профиль  
                  
 
 Re: C++ возврат указателя
Сообщение22.12.2012, 02:00 
Заслуженный участник


09/09/10
3729
Ну выкиньте свой отладчик и возьмите нормальный:

Изображение

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group