#c #arrays #multidimensional-array
#c #массивы #многомерный массив
Вопрос:
Как я могу создать функцию на C, которая возвращает массив строк? Или многомерный массив символов?
Например, я хочу вернуть массив char paths[20][20]
, созданный в функции.
Моя последняя попытка
char **GetEnv()
{
int fd;
char buf[1];
char *paths[30];
fd = open("filename" , O_RDONLY);
int n=0;
int c=0;
int f=0;
char tmp[64];
while((ret = read(fd,buf,1))>0)
{
if(f==1)
{
while(buf[0]!=':')
{
tmp[c]=buf[0];
c ;
}
strcpy(paths[n],tmp);
n ;
c=0;
}
if(buf[0] == '=')
f=1;
}
close(fd);
return **paths; //warning: return makes pointer from integer without a cast
//return (char**)paths; warning: function returns address of local variable
}
Я пробовал различные «настройки», но каждый выдает какую-то ошибку.
Я не знаю, как работает C
Комментарии:
1. Пожалуйста, покажите код, который создает массив. Предполагая, что массив набран так, как
char**
вы должныreturn array
, но вам это нужноmalloc
, а не объявлять его в стеке. Помните, что переменные стека действительны только в течение срока службы фрейма стека, в котором они были объявлены.2. Вы возвращаете указатель на выделенную стеком память. Вы не можете этого сделать ‘ Компилятор говорит вам не делать этого. Разместите его в куче.
3. Я знаю разницу, я заставил код работать. Но теперь у меня появилась еще одна странная проблема. После возврата массива и успешного обхода и использования его вызов функции (который работал ранее) вызывает ловушку.
4. Похоже, вы не заставили его работать, если у вас есть ловушка. Давайте внесем ясность, вы изменили объявление путей на char ** и использовали malloc, как указано в ответах, объявление путей в char ** и использовали malloc, как указано в ответах
5. Я обновил ответ, пожалуйста, посмотрите код.
Ответ №1:
Вы не можете безопасно вернуть массив, выделенный стеком (используя синтаксис array[20][20] ).
Вы должны создать динамический массив с помощью malloc:
char **array = malloc(20 * sizeof(char *));
int i;
for(i=0; i != 20; i) {
array[i] = malloc(20 * sizeof(char));
}
Тогда возврат массива работает
Комментарии:
1. Каким будет синтаксис для возврата в этом случае? То же, что и я?
2. Вам нужно вернуть что-то типа
char**
. В вашем кодеpaths
есть этот тип.3. Значит, мне просто нужно
return paths
?4. @LifeH2O Нет, вам нужно сделать это так, как я изложил. ваш
paths
стек все еще распределен.5. @life знаете ли вы разницу между стеком и кучей. Пока вы этого не сделаете, вам нужно stop.@life знаете ли вы разницу между стеком и кучей? Пока вы этого не сделаете, вам нужно остановиться.
Ответ №2:
Вы должны просто return array
( return array;
) . **
объявление after используется для разыменования.
Кроме того, убедитесь, что память для этого массива выделена в куче (с использованием malloc
аналогичной функции or)
Комментарии:
1. @Foo Bah сказано в исходном вопросе
return **array
.2. его строка была
return **array;
, которая вызывает разыменование.