Сегментация Fault char ** после malloc - PullRequest
0 голосов
/ 09 октября 2019

Я хочу ** char finalString, то есть список *char. После выполнения моей функции каждый указатель *char содержит char 'A', 'B', 'C', которые затем можно передать функции, ожидающей параметр типа char**. Каждая строка должна быть отдельной, но в том же массиве, следовательно, **.

Создавая **char, я написал следующее:

char ** finalString;
finalString = malloc(sizeof(char*)*3);
int stringAddressCounter = 0;

Затем, чтобы добавить к нему символ, я попробовал следующее:

char ** nextStringAddress = finalString + stringAddressCounter;
** nextStringAddress = 'A';
stringAddressCounter++;

ОднакоУ меня ошибка сегментации во второй строке этого блока.

Что я делаю не так?

1 Ответ

1 голос
/ 09 октября 2019

Вы выделили память для своего char*, но не выделили память для своего char для хранения.

Вот правило большого пальца для указателя, каждый * должен иметь malloc, что означает для char ** у вас должен быть один malloc для char * и еще один для char.

, также игра с указателем иногда вводит в заблуждение, и вместо этого для удобства чтения следует использовать скобку

char ** nextStringAddress = finalString + stringAddressCounter;
nextStringAddress[stringAddressCounter] = malloc(sizeof **nextStringAddress * 3)
nextStringAddress[stringAddressCounter][0] = 'A';
nextStringAddress[stringAddressCounter][1] = 'a';
nextStringAddress[stringAddressCounter][2] = '\0';
stringAddressCounter++;

Выполнение с одним malloc также возможно, например, так:

char ** nextStringAddress = finalString + stringAddressCounter;
nextStringAddress[stringAddressCounter] = "Aa";
stringAddressCounter++;

Обратите внимание на двойную кавычку здесь вокруг Aa и пропущенной второй скобки. Следует отметить, что, выполняя это, вы, по сути, назначаете зону памяти, предназначенную только для чтения, и, пытаясь назначить эту память, это приведет к ошибке сегментации.

...