2016-08-18 2 views
-5

Я инициализировал массив целых чисел, которые я позже вызываю в функции. Я заметил, что значения изменились. Что я могу сделать, чтобы это не произошло?Передача массива в качестве аргумента в функции

void check(int arr[5][6]){ 
    printf("%s", arr[0][0]); 
} 

int main(){ 
    int arr[5][6]; 
    arr[0][0] = 5; 
    check(arr); 
} 
+7

'% d' или'% i' - спецификатор формата для 'int', а не '% s'. – Ryan

+5

Замечание Пер Райана, если вы скомпилировали с '-Wall', компилятор отметит ваш' printf' как несоответствие. Кроме того, убедитесь, что вы делаете '#include ' –

ответ

3

Вы не используете правильный спецификатор формата для printf.

Чтобы напечатать int, вам необходимо использовать спецификатор формата %d. Вы используете %s, который ожидает указатель на строку с нулевым завершением.

printf("%d", arr[0][0]); 

Использование неверного формата указывает на undefined behavior.

0

Значение, хранящееся в массиве в (0,0), не изменилось. Даже если вы передали его функции. Что не так в вашей программе, так это то, как вы ожидаете, printf напечатать элемент двухмерного массива, который имеет тип данных int.

С array - это двумерный массив данных типа int. Элемент, хранящийся в arr[0][0], будет иметь тип данных int.

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

void check(int arr[5][6]) 
{ 
    printf("%d", arr[0][0]); 
} 

int main() 
{ 
    int arr[5][6]; 
    arr[0][0] = 5; 
    check(arr); 
} 

код, который вы выложили будет иметь неопределенное поведение. Код, который вы вставили, даст предупреждение. Взгляните на предупреждение, которое я получил, составив код с помощью gcc.

предупреждение: формат '% s' ожидает, что аргумент типа 'символ *', но аргумент имеет тип 2 '' Int [-Wformat =] Е ("% s", обр [0] [0]);

Помните: вы никогда не должны игнорировать предупреждение.

Вы использовали спецификатор формата "%s", который принимает указатель на массив символов в списке аргументов. Вам просто нужно изменить его на "%d".

В c. Немного приведены ниже:

%c - For Character Variable 
%d - For Integers 
%f - For Double 
%s - For Null-Terminated Character Array 
%p - For Pointers (of void * type) 
+1

Лучше сказать «% d» для 'int', а не« integers ». «целые числа», как обсуждалось в спецификации C, относятся к символу char, short, unsigned long, intmax_t', а также ко многим другим. Аналогичные проблемы с остальными (кроме '% p - для указателей (типа void *), что хорошо.) – chux

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