gpt4 book ai didi

c - 将数组传递给函数时,是否需要提供元素数作为参数?

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:08 24 4
gpt4 key购买 nike

我目前正在使用教科书C:如何编程 6/e 学习 C 编程。

现在,在书中讨论数组时,它指出当将数组(除了字符数组,由于 '\0' 字符)传递给函数时,它是必要的将数组中的元素数量也传递给函数

所以考虑到我的功能

int myfunct(int myary[], int numelements);

int myfunct(int *myary, int numelements);

假设已经用 10 个元素声明了 ary,并且我们现在在 main 函数中。

myfunct(ary, 10); 

(int numelements 是否必要[在任何一种情况下],如果是,为什么)。该书指出,编译器需要知道要处理的元素的正确数量,但是该书随后在几乎所有示例中都没有这样做,并且非常不一致。

此外,

int myfunct(int myary[][10], int numrows, int numcolumns);

关于 numrows 和 numcolumns 的相同问题。

进一步说明:

#include <stdio.h>
void test(const int ary[]);

int main(void){

int myary[10] = {1,2,3,4,5,6,7,8,9,10};
test(myary);

return 0;
}

void test (const int ary[]){
int i;

for(i = 0; i<10; i++){
printf("The number in array element %d is: %d\n", i, ary[i] );
}
}

这段代码似乎可以在没有附加参数的情况下正确编译,但我不明白为什么这本书会说我需要它们,许多网站也是如此。帮助!

最佳答案

Is it necessary? Will my code compile if I don't pass array size as argument?

这不是必需的,即使您不将数组大小作为参数传递给函数,您的代码也会编译。
但这样做是一个很好的做法。

Rationale:

C 不提供检查数组边界的方法。您可以通过数组索引或指针算法访问超出数组范围的内容(在后台,两者是相同的)并且编译器不需要警告您。但是你最终会得到一个未定义的行为
因此,重要的是您只能访问属于您的数组的内存。为此,您需要跟踪数组的大小。用户有责任这样做。

当您将数组作为参数传递时,它会衰减为指向数组第一个元素的指针。
所以函数内部的 sizeof(arg) 会给你指针的大小而不是数组。

你无法知道函数内部数组的大小(空终止字符串除外,其大小可以通过strlen获取)除非你通过它作为参数或通过其他一些簿记(如全局变量等)。

将大小作为参数传递是最明显的方法。

关于c - 将数组传递给函数时,是否需要提供元素数作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com