При тестировании в OS X 10.6.5 указанная строка не имеет ошибки.Там, где произошел сбой, было:
strcpy(arglist[argnum], tokenPtr);
, потому что arglist
(и pathlist
) - это выделенное пространство, но ни одна из строк, на которые они указывают.Вот иллюстрация arglist
в виде массива указателей (неинициализированных как ваш исходный код, затем инициализированных нулями) и массива массивов.
Когда вы вызываете strcpy
по неинициализированному указателю из arglist
, вы копируете в произвольную область памяти (как показано на первом изображении).
Чтобы решить эту проблему, вы должны создать списокТип и функции для работы со списками.
typedef struct list {
...
} list_t;
// Initialize a new list. Pass NULL to dynamically allocate list structure.
list_t* createList(list_t* list);
// Destroy a list when done with it. You must free the list* if it was
// dynamically allocated.
void discardList(list_t* list);
// return first item in list
void* first(void);
// return last item in list. Could also be called "top"
void* last(void);
// append item to list
void push(void* item);
// remove & return last item
void* pop(void);
// remove & return first item
void* shift(void);
// prepend item to list
void unshift(void* item);
Если вы реализуете списки как массивы, createList
обнулит arglist
, используя memset
.В исходном коде вы также можете назначить {0}
на arglist
при объявлении:
char *arglist[1024] = {0};
Вы можете изменить API, если вам нужно только хранить строки в списках (делаяstring_list_t
type) и не требует некоторых операций (например, shift
и unshift
. С string_list_t
, push
может выделить место для строки, скопировать строковый элемент и сохранить копию в спискеструктура.