2016-07-07 2 views
-1

Я C новичок, и я пытаюсь делать то, что указатель/память правый ...указатель инициализируется указатель на стек

В моем случае, я использую strtol и мне нужно передать символ **, чтобы удерживать одно из нескольких возвращаемых значений, но выделение кучи пространства является чрезмерным. Чистейшей правильно (я надеюсь), как я могу найти, получение места в стеке для этого есть:

char *_ = NULL; 
char **endptr = &_; 
ret = strtol("not a number", endptr, 0); 

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

EDIT: уточнить, я намерен использовать endptr, просто не _

+2

'_' - это то, что многие считают сомнительным выбором для имени переменной. –

+0

Достаточно честный. Во многих функциональных языках это обычный способ сопоставить шаблон по значению, которое вы не будете использовать. Есть ли конвенция С для такого рода вещей? – Shane

+1

'char * endptr;' 'strtol (str, & endptr, 0);'. Другими словами, объявите 'endptr' как указатель, а затем передайте адрес этого указателя на' strtol'. – user3386109

ответ

3

strtol принимает NULL в качестве второго аргумента. См http://www.cplusplus.com/reference/cstdlib/strtol/

Таким образом, вы можете написать код так:

ret = strtol("not a number", NULL, 0); 

Если не принимать NULL, вы можете избежать одной строки кода:

char *unused; 
ret = strtol("not a number", &unused, 0); 
+0

Итак, несмотря на отсутствие инициализации, пространство для * unused всегда будет в стеке, а & unused будет действительным адресом стека? – Shane

+0

@Shane Нет, 'unused' находится в стеке, а' * unused' не определено, поскольку указатель 'unpued' не установлен. Сравнить с: 'int x; printf ("% p", &x); ', который печатает адрес' x', даже если 'x' не инициализирован. –

+0

Обратите внимание, что вам нужно использовать' endptr', если вы хотите узнать, является ли результат '0 'происходит из-за того, что вход не является числом, или вход, фактически являющийся' 0' –

0

Если вы не 't need endptr, вам разрешено передавать нулевой указатель на strtol. В противном случае я не стал бы беспокоиться об именовании переменной, которую вы не будете использовать. Хотя я не думаю, что назову его _, как и у вас.

Смежные вопросы