2014 dxdy logo

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

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




 
 C++ возврат указателя
Сообщение21.12.2012, 21:54 
Итак, есть простенькая функция для аллокации памяти:
Код:
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 
Mr Alexey в сообщении #661602 писал(а):
Итак, есть простенькая функция для аллокации памяти:
Код:
void* allocate(unsigned int size) {
   return = malloc(size);

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

 
 
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:25 
venco в сообщении #661631 писал(а):
Не может быть. В этом коде синтаксическая ошибка.

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

 
 
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:26 
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 
venco в сообщении #661635 писал(а):
А это вообще сообщение отладчика, а не программы. Возможно, вам надо обновить его.

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

 
 
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:49 
Mr Alexey в сообщении #661602 писал(а):
Дебаг в эклипсе показал что проблема именно в этой функции
Вывод неверный. У вас упал отладчик, и проблема, скорее всего, в нём. А где именно ошибка в самой программе - пока не ясно, по крайней мере мне, т.к. вы привели код только одной функции, да и то с опечатками. Хинт: чтобы не было опечаток, лучше не набирать код заново, а скопировать из программы.

 
 
 
 Re: C++ возврат указателя
Сообщение21.12.2012, 23:54 
Код:
#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 
Рекурсия. См. рекурсия. Так где вызов malloc-то?

 
 
 
 Re: C++ возврат указателя
Сообщение22.12.2012, 00:39 
Код:
#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 
Ну выкиньте свой отладчик и возьмите нормальный:

Изображение

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group