Нужен ли вызов mallo c () для этого примера кода? - PullRequest
0 голосов
/ 09 апреля 2020

Предположим следующий пример кода:

//open some file

char* data[10];

for ( int i=0; !feof(file) && i < 10; i++ )
{
    fgets( data[i], 100, file );
}

//close file

AFAIK с использованием массива указателей без выделения памяти для отдельных указателей, как это небезопасно, и если работает, то это потому, что в этой памяти не содержится никакой важной информации регион.

Но я видел много людей, использующих это, как это, и я сомневался в себе.

Это правильное использование?

1 Ответ

1 голос
/ 09 апреля 2020

Ваш код имеет неопределенное поведение и крайне небезопасен.

Элементы ваших массивов data являются указателями, а их начальные значения - мусором. Они могут указывать на память, которая используется для каких-то других целей, или на память, которая не существует. Я был бы удивлен, если бы ваша программа не взломала sh.

Вам не нужно звонить malloc. Вы можете определить

char data[10][100];

Кроме того, вы не должны использовать feof, чтобы определить, когда вы закончили чтение ввода. feof возвращает истинное значение, если функция ввода предыдущая не выполнена из-за исчерпания ввода. Если есть ошибка, отличная от запуска, отличного от исчерпания ввода, ferror вернет true, а feof - нет. Используйте значение, возвращаемое fgets, чтобы определить, удалось ли оно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...