Проблема с char * и char ** (C -> C ++) - PullRequest
1 голос
/ 06 октября 2010

Хорошо, я пытаюсь интегрировать некоторый код C в проект C ++ и столкнулся с несколькими проблемами.Я подробно опишу первый здесь.

Я продолжаю сталкиваться с этой ошибкой:

ошибка: невозможно преобразовать 'char *' в 'char **' в назначении |

Вот неправильный код (с отмеченной точкой останова):

char** space_getFactionPlanet( int *nplanets, int *factions, int nfactions )
{
   int i,j,k;
   Planet* planet;
   char **tmp;
   int ntmp;
   int mtmp;

   ntmp = 0;
   mtmp = CHUNK_SIZE;
   tmp = malloc(sizeof(char*) * mtmp); <--- Breakpt

Функция malloc является производной от заголовка C.Вот объявление:

_CRTIMP void* __cdecl __MINGW_NOTHROW    malloc    (size_t) __MINGW_ATTRIB_MALLOC;

Я использую кодовые блоки, которые настроены на использование MinGW.Приведенный выше синтаксис совершенно чужд для меня.

Я полностью озадачен, поскольку этот код отлично работает в программе на C, из которой я его взял.

Любые идеи?

РЕДАКТИРОВАТЬ1:

Упс, только что понял, что объявление от stdlib.h.

РЕДАКТИРОВАТЬ 2:

Я пытался:

tmp = static_cast<char **>(malloc(sizeof(char*) * mtmp));

Как и предлагалось, но не получаю ошибку: неверный static_cast из типа 'char *' в тип 'char **'.

EDIT 3:

Хорошо, reinterpret_cast работает, но кажется, что решение заменить mallocгораздо более элегантно просто, так что я пойду с этим.

Однако в конце функции нет свободного (tmp).Является ли это проблемой, если я не вставил удаление tmp []?

РЕДАКТИРОВАТЬ 4: я должен добавить, что функция tmp возвращается функцией, поэтому необходимо удалить tmp илиэто автоматически?

Хорошо, я отмечаю, что это решено.Спасибо за вашу помощь.

Ответы [ 5 ]

5 голосов
/ 06 октября 2010

C ++ не так свободен с преобразованиями указателей. Вам нужно будет сделать что-то вроде этого:

tmp = static_cast<char **>(malloc(sizeof(char *) * mtmp));

Это сработает, если ваш malloc() вернет void*. Однако ошибки, которые вы получаете, указывают, что ваш malloc() объявлен как возвращающий char*, и в этом случае вам придется использовать reinterpret_cast вместо этого:

tmp = reinterpret_cast<char **>(malloc(sizeof(char *) * mtmp));

Приводит тип возврата malloc() к типу, подходящему для присвоения, в tmp. Вы можете прочитать больше о различных типах приведений в C ++ на Приведение типов .

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

tmp = (char **)malloc(sizeof(char *) * mtmp);
4 голосов
/ 06 октября 2010

Если вы конвертируете в C ++, тогда давайте покончим с malloc?

tmp = new char*[mtmp];

Но позже вы, вероятно, найдете что-то вроде этого:

free(tmp);

Что вам нужно изменить на это:

delete [] tmp;

Если из функции возвращается tmp, не удаляйте ее.Вам нужно отследить указатель.Где-то, может быть, в нескольких местах, бесплатно будет называться.Вам нужно заменить это на delete, если вы собираетесь использовать это решение.Тем не менее, еще лучшим решением было бы совместить указатели и заменить их на

vector<string>
2 голосов
/ 06 октября 2010

malloc(3) возвращает void*, который может быть назначен любому другому типу указателя в C, но не в C ++. Это одно из мест, где C ++ не имеет обратной совместимости с C. Вы можете либо сделать то, что сказали другие авторы, - привести его к char** или перейти к правильному использованию C ++ в бесплатном магазине с операторы new[] и delete[]:

char** tmp = new char*[mtmp]; // was malloc(sizeof(char*) * mtmp);
// ... use tmp
delete [] tmp; // was free( tmp );
1 голос
/ 06 октября 2010

Изменить tmp = malloc(sizeof(char*) * mtmp); на:

 tmp = (char**)malloc(sizeof(char*) * mtmp);

И не ходите и не меняйте malloc на new, как некоторые ошибочно предположили, по двум причинам:

1) он не сломан, поэтому не исправляйте его (!)

2) Вы могли бы представить тонких или утонченных ужасных жуков, которые впоследствии поглотят часы вашей жизни.

Тратьте время на исправление неработающего кода, а не кода, который работает ...

1 голос
/ 06 октября 2010

Возможно, приведение в порядок:

tmp = static_cast<char **>(malloc(sizeof(char*) * mtmp));
...