У вас есть несколько проблем в вашем существующем коде.Во-первых, здесь:
int n = 2;
char *tab1[n]; /* here, the contents of tab1 are unspecified */
fill(n, "a", "b", "c", tab1); /* so here, you can't read them */
То есть, когда fill
делает
} else if(tab[n-1] == ""){
, предполагается, что tab[1]
(при первом вызове) - это то, что вы можете прочитать на законных основаниях.Это не так, потому что вы никогда ничего не кладете туда.
Вы определенно не можете предполагать, что оно указывает на строковый литерал ""
, и вы также не можете предполагать, что оно указывает на любое разыменованное местоположение(так что вы не можете писать !*tab[n-1]
или !strcmp(tab[n-1], "")
или что-то еще.)
К счастью, благодаря тому, как вы написали свой код, вам никогда не нужно нужно для проверки этого значения, так как вынаписать ровно один раз для каждой записи.Таким образом, вы можете просто удалить это условие.
Далее у вас есть другая проблема: назначаемые вами значения являются указателями на локальный массив символов с автоматическим временем жизни: text
.Все они выходят из области видимости, когда функция возвращается, и тогда запрещено разыменовывать любые элементов в tab1
.Изменение назначений, например, на
tab[n-1] = strdup(text);
, исправит это, но имейте в виду, что вызывающий абонент несет ответственность за free
каждый элемент.