我想在c中编写一个能够打印我们创建的数组的函数。但是,有一个问题。当我想创建循环时,我需要知道数组中的元素数量。所以,我使用sizeof函数来解决这个问题。
我编写了行size = sizeof(list) / sizeof(list[0]);
以获取整个数组的大小并将其除以一个元素的大小,以获得数组中元素的数量。但是,当我构建代码时,我收到以下警告:
警告:数组函数参数'list'上的'sizeof'将返回'int *'
的大小
#include <stdio.h>
void displayArray(int myarray[]);
int main()
{
int list1[] = {0, 5, 3, 5, 7, 9, 5};
displayArray(list1);
return 0;
}
void displayArray(int list[])
{
int size;
size = sizeof(list) / sizeof(list[0]);
printf("Your array is: ");
for (int i = 0; i < size; i++)
{
printf("%d ", list[i]);
}
printf("\n");
return;
}
答案 0 :(得分:3)
void displayArray(int list[])
完全与void displayArray(int *list)
相同。这是因为一个数组没有值本身,当你尝试只计算数组的标识符时,你得到的是指向它的第一个元素的指针。
因此,将数组传递给函数总是意味着传递指针。 sizeof
运算符(它不是函数)不会获取您的数组类型,而是指针类型,并且指针的大小对您没用。
一种典型的方法是将数组的大小明确地作为第二个参数传递给函数,正确的类型是size_t
。
答案 1 :(得分:2)
没有数组参数这样的东西。他们只是隐藏的指针。
你应该在调用者中调整数组的大小(那里有一个真正的数组) 并将大小传递给被调用者。
(当数组传递给callees时,它们的大小信息会在数组到指针转换中获得很多,所以你必须单独传递它)
#include <stdio.h>
void displayArray(int myarray[], int size);
int main()
{
int list1[] = {0, 5, 3, 5, 7, 9, 5};
displayArray(list1, sizeof list1 / sizeof list1[0]);
/*you don't need the parens if the argument is a variable / isn't a type */
return 0;
}
void displayArray(int list[], int size)
{
printf("Your array is: ");
for (int i = 0; i < size; i++)
{
printf("%d ", list[i]);
}
printf("\n");
return;
}
答案 2 :(得分:1)
根据C标准(6.3.2.1 Lvalues,数组和函数指示符)
3除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字, an 具有类型''数组类型''的表达式将转换为 带有''指向类型''的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。
和(6.7.6.3函数声明符(包括原型))
7声明参数为''数组''的数据应为 调整为''限定指向类型'',其中类型限定符 (如果有的话)是在数组类型的[和]内指定的那些 推导...
因此,以下函数声明声明了相同的一个函数
void displayArray(int myarray[100]);
void displayArray(int myarray[10]);
void displayArray(int myarray[1]);
void displayArray(int myarray[]);
void displayArray(int *myarray);
您可以在程序中包含所有这些声明(不是定义)。声明数组的函数参数被调整为指针类型。
因此,如果数组没有sentinel值,则需要显式传递给数组大小的函数。例如
void displayArray( const int *myarray, size_t n );
//...
displayArray( list1, sizeof( list1 ) / sizeof( *list1 ) );
答案 3 :(得分:0)
您应该创建一个变量来包含数组的大小,并将其作为参数添加到函数中。 'list'只是指向数组第一个元素的指针,所以当你检查sizeof(list)
时,它会返回指针的大小。
试试这样:
#include <stdio.h>
void displayArray(int myarray[]);
int main()
{
int list1[] = {0, 5, 3, 5, 7, 9, 5};
int size1 = 7;
displayArray(list1,size1);
return 0;
}
void displayArray(int list[], int size)
{
printf("Your array is: ");
for (int i = 0; i < size; i++)
{
printf("%d ", list[i]);
}
printf("\n");
return;
}