Распределение памяти для указателей в c
У меня есть массив следующим образом:
char* arg[1024];
Теперь, чтобы инициализировать arg, который я передам функции, я делаю следующее:
arg = (char**)calloc(1024,sizeof(char*));
Однако всякий раз, когда я передаю arg функции. Я получаю ошибку сегментации. Функция в основном делает очень простую команду для разбора слов:
void parse(char* buffer, char** arg)
{
while(*buffer!='\0')
{
*arg=buffer;
arg++;
while(*buffer!=' ')
buffer++;
while(*buffer == ' ')
{
*buffer = '\0';
buffer++;
}
}
}
Я делаю что-то не так в распределении памяти? или попутные указатели?
3 ответа
char* arg[1024];
обеспечивает статически распределенный массив из 1024 char
указатели. Вам не нужно выделять его снова динамически. Так что убери свой calloc()
линия.
Помимо вашей проблемы размещения есть еще одна ошибка. Взгляни на:
while(*buffer != ' ')
buffer++;
Что будет, если buffer = "test"
? Ваш while
-loop не найдет пробел и продолжает перебирать снаружи buffer
, В результате чего все виды неопределенного поведения...
Чтобы исправить это, вам также нужно проверить терминатор строки:
while(*buffer != 0 && *buffer != ' ')
buffer++;
arg уже выделен в вашем случае. вы говорите, что вам нужно, чтобы он был 1024 элементов большим - его статически распределены
=> оставить char *arg[1024]
и заменить его на char **arg
char* arg[1024];
массив указателей на символы
arg = (char**)calloc(1024,sizeof(char*));
неправильно. Мы не можем назначить новый выделенный адрес памяти arg
,
если вы хотите создать массив строк, сделайте так: (я думаю, вам это нужно)
char* arg[1024];
arg[i] = (char*)calloc(1024,sizeof(char));
где i
это индекс.
Ты говоришь segmentation fault.
но я думаю, что вы должны получить ошибку компиляции для arg = (char**)calloc(1024,sizeof(char*));
заявление. ошибка: несовместимые типы при назначении
Я также заметил ошибки в parse()
, (ответил Вегер)
Вы также можете использовать strsep()
функция для разбора вас buffer
строка, здесь мой ответ может быть полезен для этой цели.