2013-09-26 4 views
1

Могу ли я сделать это в C:статический массив в качестве аргумента функции в C

void myFunc(int *vp) { 
    // do some stuff with vp 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    myFunc(v); 

    return 0; 
} 

Я имею в виду, что было бы правильно? myFunc (& v); ?

Спасибо!

+1

Вы спрашиваете, потому что у вас есть ошибка или вы спрашиваете, работает ли она последовательно? – Ryan

+4

Попробуйте. Запустить его. Возможно, это работает. В любом случае, вы что-то узнаете. :) – Bucket

+0

Да! Кажется, я работаю. Когда я запускаю его на VS2012, все выглядит отлично. Но когда я запускаю его в Linux, у меня возникла ошибка сегментации. Я не знаю точно, если это проблема. У меня возникла ошибка сегментации через 4 часа вычислений. Я спросил, потому что я подозреваю, что это может быть проблемой. –

ответ

3

Массивы распадаются на указатели, когда вы передаете их в качестве аргументов. Однако разложение массива не совпадает с адресом массива.

«Decay» - это то, как некоторые типы преобразуются при передаче в качестве аргументов функции. Несмотря на то, что v имеет тип int [5], он передается в функцию int*. Это поведение, которое многие люди не любят, но ему нечего делать.

Обратите внимание, что с другой стороны, тип &v - это int (*)[5], то есть указатель на массив из 5 целых чисел. Этот тип не распадается, т. Е. Он не преобразуется автоматически в другой тип, если вы передаете его как параметр функции (и поэтому он не будет работать, если вы использовали его в своем примере, так как вам нужен указатель для целых чисел, а не для указателя на массив целых чисел).

«Правильная» вещь, которую нужно сделать (при условии, что распад - это нормально) - это сделать myFunc(v), так же, как вы делаете в своем фрагменте. Имейте в виду, что вы теряете информацию о границах массива, когда вы это делаете.

1

Да ... Ваш код верный.

Здесь v==&v[0] имя массива равно адрес первого элемента массива

myFunc(v); 

проходящей имя массива в качестве аргумента, что означает, что вы передаете адрес первого элемента массива.

void myFunc(int *vp) 

Здесь вы используете указатель. которые хранят адрес первого элемента массива, который передается так, что вы можете получить доступ к блоку, который покрывается массивом. Увеличивая местоположение указателя.

И

myFunc(&v); 

    &v==&&v[0]; 

& v является адрес адрес первого элемента массива.

Теперь

void myFunc(int *vp)  

Здесь Вы получили адрес адрес первого элемента массива, это не указывает на массив. Вместо этого указывается некоторое расположение памяти. Теперь вы не можете получить доступ к массиву, увеличивая указатель.

1

Ваш код верный Он будет работать .... Но вы должны проявлять особую осторожность, чтобы проверить граничное условие. Пожалуйста, просмотрите код.

void myFunc(int *vp) { 
    vp[5] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

аналогично

void myFunc(int *vp) { 
    vp[5] = 30; 
    myFunc2(vp); 
} 

void myFunc2(int *vp) { 
    vp[6] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

Это приведет к ошибке сегментации из-за стека curruption.Так как локальные переменные находятся в стеке.

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