Размер выделенного буфера для argv в аргументе C командной строки - PullRequest
0 голосов
/ 31 мая 2018

Когда мы пишем программу на C, которая может принимать аргументы командной строки, мы пишем основную функцию как:

int main(int argc, char **argv) {
. . .
}

Мы знаем, argc больше, чем равно 1 Итак, по крайней мере argv[0]существует.Мой вопрос: каков размер выделенного буфера для argv[0] и последующих аргументов, если таковые имеются, например argv[1], argv[2] и т. Д.?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

каков размер выделенного буфера для argv[0] и последующих аргументов

Ответ "по крайней мере достаточно большой, чтобы содержать строку, на которую указывает нулевой терминатор".

Например, в типичной системе Unix с командой

cat /etc/passwd

argc будет два, а буфер, выделенный для argv[0], будет не менее 4 байтов, а буфер, выделенный дляargv[1] будет не менее 12 байтов.Вы не можете предполагать что-либо еще о размерах буферов или о том, как и где они размещены.Об этом заботится код прелюдии, который запускается до main.

0 голосов
/ 31 мая 2018

Я думаю, что полный ответ, как сказано в комментарии: это зависит от платформы.

Но, глядя на исходный код, по крайней мере ядро ​​Linux скопирует только необходимые байты в программуstack.

Кроме того, нет никакой гарантии, что ваш компилятор не использует магию аргументов.

0 голосов
/ 31 мая 2018

Мы знаем, что argc больше чем равно 1

Ну, это не так.Это должно быть неотрицательным.Также это может быть 0.

В случае, если существует argv[n], размер argv[n] - это размер указателя в вашей платформе.Размер памяти, на который указывает указатель, совпадает с размером строки аргументов командной строки (поддерживаемой базовой средой).

Цитирование C11, глава §5.1.2.2.1

  • Значение argc должно быть неотрицательным.

и,

  • Если значение argc больше нуля, элементы массива от argv[0] до argv[argc-1] включительно должны содержать указатели на строки, которым перед запуском программы передаются значения, определяемые реализацией средой хоста.Намерение состоит в том, чтобы предоставить программе информацию, определенную до ее запуска, из другого места в размещенной среде.[...]

  • Если значение argc больше нуля, строка, на которую указывает argv[0], представляет имя программы;argv[0][0] должен быть нулевым символом, если имя программы недоступно из среды хоста.Если значение argc больше единицы, строки, на которые указывают argv[1] - argv[argc-1], представляют программные параметры .

...