2013-08-14 3 views
3

Когда аргументы функции одного типа, следующий код четко определен и переносится?Передавать аргументы функции указателем

void foo(int* p, int size); 
void pass_on_args_by_pointer(int a, int b, int c) 
{ 
    foo(&a, 3); 
} 

Чтобы уточнить: аргумент 'size' должен содержать количество элементов в массиве p. Итак, я хочу передать все три ints в foo.

+6

Вы ожидаете, что 'foo' сможет получить доступ к' b' и 'c' каким-то образом? Если да, то ** нет **. –

+0

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

+0

А что, если параметры передаются в регистры? –

ответ

7

Нет, это не переносимо и не определено. Компиляторы не обязаны выделять функциональные параметры в соседних местах в памяти. Фактически, они не обязаны размещать параметры b и c в памяти, так как вы не берете их адрес. Любой доступ за пределами int до p в foo является неопределенным поведением.

-1

Даже если бы это было возможно (теоретически, это должно, потому что стек может быть представлен как массив), ваш компилятор не обязан передавать аргументы в стек. Например, вместо этого можно использовать регистры, чтобы оптимизировать ваш код, а затем ваш код сломается.

Таким образом, попытка доступа к аргументам другой функции таким образом будет неопределенным поведением.

+0

Неправильное предположение. Стек не может быть представлен как массив, насколько это предусмотрено стандартом C++. – MSalters

+0

Я не говорю о проблемах какого-либо конкретного языка, я говорю о стеке процессора в памяти. Например, 3 32-битных целых числа в стеке могут быть представлены в виде массива размером 3 элемента (массив снова, на каком-либо конкретном языке) – Jocke

0
void foo(int** p, int size) 
{ 
    **p = size; 
    return; 
} 
void pass_on_args_by_pointer(int *a, int b, int c) 
{ 
    foo(&a, 3); 
} 

int main(void) 
{ 
    int a = 0; 
    pass_on_args_by_pointer(&a, 0, 0); 
    printf("a = %d", a); 

} 

Если вы хотите присвоить некоторое значение varaable a, вам нужно использовать указатель на указатель.

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