Чтобы получить переменные среды, вам нужно объявить main
следующим образом:
int main(int argc, char **argv, char **env);
Третий параметр - это список переменных среды, определяемый NULL
. См:
#include <stdio.h>
int main(int argc, char **argv, char **environ)
{
for(size_t i = 0; env[i]; ++i)
puts(environ[i]);
return 0;
}
Вывод этого:
LD_LIBRARY_PATH=/home/shaoran/opt/node-v6.9.4-linux-x64/lib:
LS_COLORS=rs=0:di=01;34:ln=01;36:m
...
Обратите внимание, что sizeof(environ[i])
в вашем коде не дает вам длину
строка, она получает размер указателя, так что
strncpy(list[i], environ[i], sizeof(environ[i]));
неправильно. Также весь смысл strncpy
заключается в ограничении в зависимости от пункта назначения ,
не на источнике, в противном случае, если источник больше, чем место назначения, вы
будет по-прежнему переполнять буфер. Правильный вызов будет
strncpy(list[i], environ[i], 80);
list[i][79] = 0;
Имейте в виду, что strncpy
может не записать завершающий '\0'
байт, если
пункт назначения недостаточно велик, поэтому необходимо обязательно прекратить
строка. Также обратите внимание, что 79 символов могут быть слишком короткими для хранения переменных env. Например, моя LS_COLORS
переменная
огромен, длиной не менее 1500 символов. Возможно, вы захотите сделать list[i] = malloc
звонки на основе strlen(environ[i])+1
.
Другое дело: ваш обмен
strcpy(temp, list[i]);
strcpy(list[i], list[i+1]);
strcpy(list[i+1], temp);
j = sizeof(list[i]);
работает, только если все list[i]
указывают на память одинакового размера. Поскольку list[i]
являются указателями, более дешевый способ обмена был бы
поменяйте местами указатели:
char *tmp = list[i];
list[i] = list[i+1];
list[i+1] = tmp;
Это более эффективно, это операция O (1), и вам не нужно беспокоиться, если
области памяти не имеют одинаковый размер.
Чего я не понимаю, что вы намереваетесь сделать с j = sizeof(list[i])
? Не только
что sizeof(list[i])
возвращает вам размер указателя (который будет постоянным
для всех list[i]
), почему вы возитесь с бегущей переменной j
внутри
блок? Если вы хотите выйти из цикла, сделайте break
. И вы ищете
strlen(list[i])
: это даст вам длину строки.