Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数中获取数组的计数_C_Arrays_Pointers_Parameter Passing_Sizeof - Fatal编程技术网

C 从函数中获取数组的计数

C 从函数中获取数组的计数,c,arrays,pointers,parameter-passing,sizeof,C,Arrays,Pointers,Parameter Passing,Sizeof,我正在尝试编写一个函数来打印给定数组的元素。但是,我不明白如何计算传递到函数中的数组元素。代码如下: 在本例中,我试图从函数中获取计数,尽管这只返回1 #include <stdio.h> void first_function(int ages[], char *names[]) { int i = 0; int count = sizeof(*ages) / sizeof(int); for(i = 0; i < count; i++) {

我正在尝试编写一个函数来打印给定数组的元素。但是,我不明白如何计算传递到函数中的数组元素。代码如下:

在本例中,我试图从函数中获取计数,尽管这只返回1

#include <stdio.h>

void first_function(int ages[], char *names[]) {
    int i = 0;
    int count = sizeof(*ages) / sizeof(int);
    for(i = 0; i < count; i++) {
        printf("%s has lived %d years.\n", names[i], ages[i]);
    }
}

int main(int argc, char *argv[])
{
    int ages[] = { 7, 32, 36 };
    char  *names[] = {
        "Tiger", "Sandy",
        "Ryan"
    };

    first_function(ages, names);
    printf("---\n");

    return 0;

}
#包括
void first_函数(int ages[],char*names[]){
int i=0;
int count=sizeof(*ages)/sizeof(int);
对于(i=0;i
在这个例子中,我给函数一个额外的参数(count),然后从main中获取count。这是正常的做法吗?不知怎么的,它看起来不干净

#include <stdio.h>

void first_function(int ages[], char *names[], int count) {
    int i = 0;
    for(i = 0; i < count; i++) {
        printf("%s has lived %d years.\n", names[i], ages[i]);
    }
}

int main(int argc, char *argv[])
{
    int ages[] = { 7, 32, 36 };
    char  *names[] = {
        "Tiger", "Sandy",
        "Ryan"
    };

    int count = sizeof(ages) / sizeof(int);

    first_function(ages, names, count);
    printf("---\n");

    return 0;

}
#包括
void first_函数(整数年龄[],字符*名称[],整数计数){
int i=0;
对于(i=0;i
是,您不能在此处使用
sizeof
来获取被调用函数中数组的长度。因为数组在被调用函数中衰减为指针。这就是为什么它将返回指针的大小,而不是数组的大小

解决方案-您需要传递另一个参数来指定数组的大小,或者保留一个像
NULL
这样的占位符或一些值来标记数组的结尾。(你在第二个解决方案中也遵循了这一点——这很好,而且很有效)

sizeof
的返回值为
size\u t
。使用
size\u t
而不是
int

这是处理操作员返回的
大小的正确方法。

您所谓的不干净方法是正常方法。(如果数组参数已衰减为指针类型,
sizeof
习惯用法不起作用)。虽然考虑使用<代码> SsieZiT<<代码>类型进行计数,但不使用<代码> int <代码> > < /P>
另一种方法是使用一个特定的值来表示数组的结束。实际上,这就是字符串库函数在C中的工作方式;根据C标准(6.7.6.3函数声明器(包括原型))使用NUL信号发送字符串的结尾。

7应调整参数声明为“类型数组” 到“类型的限定指针”,其中类型限定符(如果有) 是在数组类型的[and]中指定的 派生

所以这个函数声明

void first_function(int ages[], char *names[]);
在调整像数组一样声明的相应参数后,等价于下面的声明

void first_function( int *ages, char **names );
也就是说,参数
ages
names
在函数中具有指针类型。 因此,这个表达式

int count = sizeof(*ages) / sizeof(int);
(我想你是说

int count = sizeof(ages) / sizeof(int);
                   ^^^^
(尽管如此)

相当于

int count = sizeof( int) / sizeof(int);
int count = sizeof(int *) / sizeof(int);
因为子表达式
*ages
的类型是int

如果你将表达式写成

int count = sizeof(ages) / sizeof(int);
那么它就相当于

int count = sizeof( int) / sizeof(int);
int count = sizeof(int *) / sizeof(int);
并且同样不会产生作为参数传递的数组的大小

对于没有sentinel值的数组,如果需要,还必须将其大小传递给函数

因此,函数应该声明为

void first_function(int ages[], char *names[], size_t n);
打电话给我

size_t count = sizeof(ages) / sizeof(*ages);

first_function(ages, names, count);
请注意,无需在函数中对变量
i
进行两次初始化。该函数可以如下所示

void first_function(int ages[], char *names[], size_t count) 
{
    for ( size_t i = 0; i < count; i++) 
    {
        printf("%s has lived %d years.\n", names[i], ages[i]);
    }
}
void first_函数(整数年龄[],字符*名称[],大小计数)
{
对于(大小i=0;i
谢谢您的解释。不要解释为什么它看起来不干净,因为我实际上正在对数组做几乎相同的事情。@RyanMc:对于带引号的文本字符串(字符数组)'编译器将始终添加一个终止零(只有一个例外)–如果您预先说明需要多少个字符)。对于字符串数组,我使用终止的
NULL
。整数数组中的终止值的问题是,您的“魔法”值可能实际上是有效的。在您的情况下,年龄为
0
。。。但我注意到,由于您使用的是<代码>签名INT/COM>,一个“代码”>1 < /代码>的“AGE”将工作。OT:考虑使用<代码> Stutt将一个代码>结构> <代码>变量中的名称和年龄粘在一起。您可以让您的函数提供一个有意义的返回<代码>类型< /C> >返回代码>计数< /Cord>到调用函数,您还可以使用指针计数作为参数,并使指针的更改在调用者中可见。根据您的选择,可以执行一个或两个操作。数组位于主函数的堆栈框架中。当调用第一个函数时。您只传递位于主堆栈帧中的数组指针。所以first_fun frame不包含任何关于本地框架的信息任何关于数组大小的信息。。