Использование mallo c для массива Dynami c в C - PullRequest
1 голос
/ 02 мая 2020

У меня есть следующий фрагмент кода.

Я получаю сегфаг, когда итерация на *attachmentsArray после первой итерации, даже если size==3. Что я тут не так делаю?

void secondary(char** array, long size)
{

   *array = (char*)malloc(size*sizeof(char));
   for(int i = 0; i < size; i++)
   {
       *array[i] = '.';
   }
}
void main()
{
    char* attachmentsArray;
    long size = 3;
    secondary(&attachmentsArry, size);
}

Ответы [ 3 ]

3 голосов
/ 02 мая 2020

Оператор индексирования ([]) имеет более высокий приоритет, чем оператор разыменования (унарный *). Действительно, наивысший уровень приоритета операторов состоит из всех постфиксных операторов. Следовательно,

   *array[i] = '.'

эквивалентно

   *(array[i]) = '.'

. Это верно в том смысле, что выражение array[i] имеет тип char * и в этом смысле является допустимым операндом для унарного *, но для i, отличного от нуля, array[i] не обозначает действительный указатель, и неудивительно, что попытка разыменования приводит к ошибке.

Вместо этого вы хотите

   (*array)[i] = '.'
2 голосов
/ 02 мая 2020

Ваша проблема связана с относительным приоритетом операторов * и []. Ваша строка:

    *array[i] = '.';

разыменовывает (или пытается) элемент 'i-й' в массиве указателей.

Что вам нужно, чтобы получить доступ к элементу 'i-й' массив указывает на array так:

    (*array)[i] = '.';

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

0 голосов
/ 02 мая 2020

Ошибка сегментации из-за * array [i] = "." потому что то, что mallo c возвращает только указатель на начальный адрес выделенной памяти, вы не можете выполнить итерацию напрямую путем индексации.

другие ответы также верны, но вы также можете сделать это, увеличив указатель на точку, соответствующую адресные блоки, такие как * array = "."; * Массив ++;

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