освободить память по двойному указателю

//char char **p; declared in .h file
size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs);
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}

for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

for (size_t i = 0; i < bs; i++){free(p[i]);}

free(p);

мой код останавливается при попытке освободить последний элемент p в цикле for. Кто-нибудь, что я могу делать не так?

РЕДАКТИРОВАТЬ: у меня все еще есть та же проблема, даже когда меняю ее (char *) таНос (шс sizeof (char *));

это все равно не работает

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

использование new вместо malloc также не решает проблему

Однако этот код прекрасно освобождает память.

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

так что проблема, кажется, что-то с этим куском кода

for(size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

Я хочу, чтобы это был неявный связанный список, кто-нибудь знает, есть идея, что я делаю неправильно?

0

Решение

Вы не выделяете достаточно места для указателей. Изменить на

p = malloc(bs * sizeof(char*));
2

Другие решения

На первом malloc вам не нужно 5 байт, а 5 раз указатель.

p = (char**)malloc(bs * sizeof(char *));
1

Проблема в том, что вы:

  • выделить массив из 5 указателей
  • выделить 5 массивов символов и сохранить их в этом первом массиве
  • переместить эти указатели вниз в массиве, перезаписав (и потеряв) первый указатель и продублировав последний
  • попытаться освободить 5 указателей в массиве.

Таким образом, на последнем шаге вы дважды освобождаете указатель (как две последние записи в p[3] а также p[4] одинаковы), вызывая неопределенное поведение.

Вы говорите, что хотите «неявный связанный список», подразумевая, что вы пытаетесь вставить указатели в объекты (а не в массив верхнего уровня, как вы это делаете), и в этом случае вы хотите что-то вроде:

for(size_t j = 0; j < bs-1; j ++) { *(char **)p[j] = p[j + 1]); }
*(char **)p[bs-1] = 0;  // null terminate the linked list

это предполагает, что obj определяется что-то вроде:

struct obj {
struct obj *next;
// more fields
1
По вопросам рекламы [email protected]