2014-11-08 3 views
-3

я написать функцию, как:C программа массива в качестве параметра

void func1(char chx[], int y) 
    { 
    int wsn = 0; 

    wsn = *(int *) (&chx[2]); 
    if (wsn == 0) { 
    ... 
    } 
} 

компилятор работает хорошо, без предупреждения, без ошибок. Но когда код работает, кажется, он получает дикий указатель. код разбился.

Интересно, почему он разбился

+1

Скомпилируйте все предупреждения и информацию об отладке. Используйте отладчик, чтобы узнать, что происходит. Это зависит от того, как был вызван ваш «func1», а также от компилятора, оптимизации, процессора, ABI. Возможно, проблема выравнивания. –

+2

потому что 1. указатель не является массивом, 2. массив не является указателем, а 3. это нарушает правило строгого псевдонижа, поэтому он имеет UB. –

+2

@BasileStarynkevitch Кроме того, 'chx' является указателем, поэтому' & chx! = Chx'. –

ответ

1

Массивы, при передаче функций распадается на указатели. Это означает, что в func1 переменная chx является указателем, поэтому &chx дает указатель на указатель.

Решение: Не используйте адрес-оператора &.

+0

Спасибо, я путаю его с массивом, think & array может получить адрес массива. – cssam

+0

@cssam это может, но 'chx' является указателем, а не массивом. –

+0

Извините, я снова проверил свой код, использование похоже на: wsn = * (int *) (& chx [2]); не wsn = * (int *) (&chx); – cssam

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