2016-08-18 89 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的格式说明符,而不是'%s'。 – Ryan

+5

Per Ryan的评论,如果你用'-Wall'编译,编译器会将你的'printf'标记为不匹配。此外,请确保你正在执行'#include ' –

回答

3

您没有使用正确的格式说明符printf

要打印int,您需要使用%d格式说明符。您正在使用%s,它需要一个指向空终止字符串的指针。

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

使用不正确的格式说明符导致undefined behavior

0

存储在数组中的值(0,0)未改变。即使你已经将它传递给一个函数。你的程序出了什么问题,就是你期待printf打印一个数据类型为二维数组的元素。由于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 =] 的printf( “%S”,ARR [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”而不是“整数”。在C规范中讨论的“整数”,指的是char,short,unsigned long,intmax_t等等。与其他类似的问题(除了'%p - 指针(void *类型的指针)'这很好。) – chux

相关问题