Массив строк и char ** переменная окружения - PullRequest
0 голосов
/ 17 января 2011

Я хочу знать, как объявлен массив строк?Что я делаю, так это объявляю массив указателей указателей на строки.Например,

char *array[]= {"string1","string2","string3"};

Я читал об изменении переменных среды в Linux и наткнулся на указатель char ** environment (http://www.cs.bham.ac.uk/resources/courses/2005/17423/doc/libc/Environment-Access.html#Environment-Access).

char ** окружение объявленокак массив строк.Я думаю, что это должен быть указатель на указатель.Например,

char *array[]= {"string1","string2","string3"};
 environ = array;

Я что-то не так делаю?

Я также где-то читал, что char *argv[] = char **argv. Как это возможно?

Редактировать: Я также нашел этонить, чтобы быть очень полезным. Должен ли я использовать char ** argv или char * argv [] в C?

Ответы [ 3 ]

1 голос
/ 17 января 2011

вы смешиваете две разные вещи, которые на самом деле трудно понять тому, кто изучает C. Объявление переменных внутри функции и в качестве параметра функции - это не одно и то же.Эквивалентность

char*argv[] ~~~ char **argv

имеет место, потому что это параметр (main).На самом деле массив - это то же самое, что и объявление указателя.

Ваше назначение environ = array не ошибочно, синтаксически компилятор примет его.Но это семантически неправильно по нескольким причинам:

  • Вы не знаете, кто и как распределяется *environ.
  • Вы теряете ссылку на начальное содержимое *eviron.
  • Вы назначаете локальное хранилище, которое будет переработано после выхода из области действия функции.Так что *environ будет неопределенным, как только вы выйдете из функции.

Так что environ является особенно плохим примером для такого назначения.

1 голос
/ 17 января 2011

В Си строка - это просто массив символов.кроме того, имя массива также представляет его адрес.

это причина, по которой argv [] является адресом массива символов (который является строкой), а * argv также является адресом строки (так какэто адрес первого символа).

1 голос
/ 17 января 2011

ну проблема в этом.В вашей программе есть несколько указателей.Один, который вы присваиваете массиву строк, а другой называется environment, который указывает на переменные окружения.То, что вы говорите для C с environ = array, дает окружающей среде то же значение, что и массив .. но массив имеет указатель на локальный массив.Поэтому после этого оператора указатель окружения будет просто указывать на массив, который вы создали, но не внесли никаких изменений в свой предыдущий контент.

Я думаю, вам нужно прописать все элементы массива для окружения.Или используйте API-вызов Setenv (я думаю, что это так)

и второй вопрос.Да, первую пару [] всегда можно переписать в указатель.поэтому array [] = * array as is array[][5] = (*array)[5] и там для *array[] = **array

Я надеюсь, что помог вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...