Как распечатать значение указателя из массива? - PullRequest
0 голосов
/ 24 апреля 2011

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

Я реализую простую программу оболочки, и функция выхода должна передать значение выхода, если онопрошлоСледовательно, exit 45 должно возвращать 45 в качестве значения, но ничего не печатать *.

Команды передаются в анализатор функций в массиве char **arglist.Поскольку exit 45 - это два аргумента, мне нужно распечатать последний аргумент.

Однако мой оператор отладки printf((int)&arglist[1]) возвращает значение 163393752, которое немного отличается от переданного значения.Когда я изменил printf на puts, было напечатано правильное значение, но exit() требует целое число, а не указатель.

Используя этот пример, как я могу получить 45 из массива указателей?

* согласно профессору, цитируя его дословное выражение.

Ответы [ 5 ]

2 голосов
/ 24 апреля 2011

Найдите функцию atoi в stdlib.h (или напишите собственный эквивалент, если вам не разрешено использовать библиотеку).

1 голос
/ 24 апреля 2011

printf нужна строка формата; проверьте справочную страницу

(int)&arglist[1] должно быть arglist[1], и это char *, а не int

0 голосов
/ 24 апреля 2011

Полагаю, вы хотите сделать так:

./your_program # run your_program
ret_val=$? # gets exit status and stores into $ret_val
./other_program $ret_val # pass exit status of your_program to other_program as a argument

Однако, это неправильный способ передачи значения из одной программы в другую. Поскольку используется только младший 8 бит состояния выхода программы, см .: http://linux.die.net/man/3/exit.

Вы можете передавать значение из одной программы в другую, используя exit если ваша цель - передать состояние выхода (8-битное число), а не значение выхода (целое число).

Типичным способом передачи значения в другую программу является вывод значения: например:

ваша программа:

printf("%d", value);
exit(0);

в оболочке:

value=`./your_program` # run your program and store output into 'value'
./other_program $value

в other_program: используйте strtol (atoi устарело) для преобразования строки в целое число:

int value = stdtol(argv[1], NULL, 10);
0 голосов
/ 24 апреля 2011

Проблема в том, что &arglist[1] совпадает с &(*(arglist+1), который фактически печатает адрес в памяти arglist [1].Если вы хотите напечатать значение в этой точке, просто напечатайте arglist[1] - printf(), как правило, не нужно &.

0 голосов
/ 24 апреля 2011

Этот аргумент printf передает адрес вместо значения?Должно ли это быть * arglist [1]?Я немного заржавел в указателях c.

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