Удаление одной строки из массива двойных указателей в C? - PullRequest
0 голосов
/ 10 ноября 2019

Любая помощь при удалении одной строки из массива двойных указателей? Например, каждая строка массива содержит строку имени, например, 'J' 'o' 'h' 'n' '\0'. Из этого массива, полного имен, я хочу удалить из него имя.

char **p = malloc(arraySize*sizeof(char*));

for (i = 0;i < recordAmount;i++){
   fnames[i] = malloc(c*sizeof(char));
}

/* to summarize I scan the user data into array after I allocate memory to it */

free(*p[0]);

После использования free, указанного в моем примере кода выше, я обнаружил, что память, которую я хотел бы освободить, не является 't, будучи свободным, и если я пойду печатать содержимое массива, он в итоге напечатает данные, которые были там изначально, например, 'J' 'o' 'h' 'n' '\0'. Имейте в виду, что внутри массива есть несколько имен.

1 Ответ

1 голос
/ 10 ноября 2019

Прежде всего, здесь:

free(*p[0]);

Вы разыменовываете на один раз больше, чем вам нужно. Чтобы освободить первую строку, вам нужно просто:

free(p[0]);

После освобождения память освобождается, и чтение и запись в нее не определено. Если вы читаете после освобождения, может произойти все что угодно:

  • В итоге вы можете прочитать то же самое, что написали.
  • В итоге вы можете прочитать случайный мусор.
  • Вы можете вызвать сбой вашей программы.
  • И т. Д. *

После освобождения, как правило, больше делать не нужно. Однако, если вы хотите убедиться, что к данным больше нельзя получить доступ (чтобы избежать неопределенного поведения), вы можете установить этот конкретный указатель на NULL. Это довольно распространенная хорошая практика, используемая, чтобы избежать использования после бесплатных ошибок.

free(p[0]);
p[0] = NULL;

char *x = p[0]; // Fine, just reads NULL.
puts(x);        // Segmentation fault, trying to dereference NULL.
                // Memory corruption prevented.
...