我已经初始化了一个整数数组,后来我在一个函数中调用它。我注意到这些值已经改变了。我能做些什么来阻止这种情况的发生?在函数中传递一个数组作为参数
void check(int arr[5][6]){
printf("%s", arr[0][0]);
}
int main(){
int arr[5][6];
arr[0][0] = 5;
check(arr);
}
我已经初始化了一个整数数组,后来我在一个函数中调用它。我注意到这些值已经改变了。我能做些什么来阻止这种情况的发生?在函数中传递一个数组作为参数
void check(int arr[5][6]){
printf("%s", arr[0][0]);
}
int main(){
int arr[5][6];
arr[0][0] = 5;
check(arr);
}
您没有使用正确的格式说明符printf
。
要打印int
,您需要使用%d
格式说明符。您正在使用%s
,它需要一个指向空终止字符串的指针。
printf("%d", arr[0][0]);
使用不正确的格式说明符导致undefined behavior。
存储在数组中的值(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)
更好地说“%d”代表“int”而不是“整数”。在C规范中讨论的“整数”,指的是char,short,unsigned long,intmax_t等等。与其他类似的问题(除了'%p - 指针(void *类型的指针)'这很好。) – chux
'%d'或'%i'是'int's的格式说明符,而不是'%s'。 – Ryan
Per Ryan的评论,如果你用'-Wall'编译,编译器会将你的'printf'标记为不匹配。此外,请确保你正在执行'#include' –