Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 - Fatal编程技术网

获取传入C中函数的数组的长度

获取传入C中函数的数组的长度,c,arrays,pointers,C,Arrays,Pointers,如何在不单独传递长度的情况下将数组传递给函数并保留其长度信息 [自我问答-比下面我的答案更好]你可以像许多人一样,单独传递长度。另一种可能不切实际的方法是,您可以传递一个指向数组本身的指针,并从中检索长度 编辑#2:删除了带有全局变量的版本,因为这是一种不好的做法。我正在重新发布旧的解决方案,虽然僵硬,但它没有那么乏味,也没有那么危险 编辑#3:用至少能说明这是多么有用的东西替换了原始文件 #include <stdio.h> void printArray(char (*p)[1

如何在不单独传递长度的情况下将数组传递给函数并保留其长度信息


[自我问答-比下面我的答案更好]

你可以像许多人一样,单独传递长度。另一种可能不切实际的方法是,您可以传递一个指向数组本身的指针,并从中检索长度

编辑#2:删除了带有全局变量的版本,因为这是一种不好的做法。我正在重新发布旧的解决方案,虽然僵硬,但它没有那么乏味,也没有那么危险

编辑#3:用至少能说明这是多么有用的东西替换了原始文件

#include <stdio.h>

void printArray(char (*p)[10]);

int main(void){

    char p[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    printArray(&p);
    return 0;

}

void printArray(char (*p)[10]){

    for(int i = 0; i < sizeof (*p); i++)
        printf("%d ", (*p)[i]);
    printf("\n");
}

如果您将数组作为指针传递,则在C中无法知道其长度。长度必须由调用方提供。

在C中,数组不能完全传递给函数,因此不可能。当您传递数组名时,它将衰减为指向第一个元素的指针。使用
sizeof
操作符对您没有任何帮助,因为它会给出指针的大小

要么将数组的大小传递给函数,要么在数组末尾使用sentinel值

#include <stdio.h>

int size(int *a)
{
    int count = 0;
    while(*a++ != -1)
        count++;
    return count + 1;
}
int main(void)
{
    signed int a[] = { 3, 5, 7, 9, 10, -1};

    printf("size of array is: %d\n", size(a));
}
#包括
整数大小(整数*a)
{
整数计数=0;
而(*a++!=-1)
计数++;
返回计数+1;
}
内部主(空)
{
符号int a[]={3,5,7,9,10,-1};
printf(“数组大小为:%d\n”,大小(a));
}
总结一下:

  • 提供标记数组结尾的
  • 还是给被叫人

只有两种方法真正有效。

这里-我知道传统的方法,但我认为我有一个有用的解决方法,发布在下面。我认为没有任何投否决票的人看过和/或试过运行我的解决方案。为什么你问这个问题,仅仅在2秒钟后提供你自己的答案?此外,您的答案是不正确的,由于提供了静态数字10 in作为参数,因此您没有处理获取任意大小数组的大小的问题,您处理的是已经知道大小的例程,因为您已经静态提供了它,而且您的问题对于数组来说是模糊的,但是你真正想要的是一个字符数组,如果像字符串than一样使用,strlen会起作用。@Diti-True,我确实做过,但是这个问题在某处和网络上的其他地方已经有了很多答案,所以如果这个OP所做的只是发布QA以获得分数,那就超出了SO的范围。此外,OPs的答案对于所问的问题也不正确。下面的另外两个答案是正确的,C不允许已知数组大小,除非显式传入。这就是为什么现在许多例程的安全版本都是这样编写的,目的是明确地传递一个大小参数。@AmadeusDrZaius“我认为没有任何向下投票的人看过和/或尝试过运行我的解决方案。”还有另一种选择:人们可能已经看过了,并且知道它可以按照您的描述工作,但我觉得这实际上是一个毫无价值的解决方案。我不是你的反对者之一,但我确实有这样的感觉。是的,确实如此,但整个函数只适用于大小为10的数组,因为它不在运行时计算数组大小,而是在编译时计算数组大小(从其参数类型
*p[10]
)@AmadeusDrZaius你对这种自我Q/A的假设是有缺陷的。它假定这是一个常见(甚至偶尔)的问题,需要这样做,并且数组长度在构建时是一个已知常量(在本例中,该常量为10)。这个问题不是一个人问的。。。人们问的问题是,当他们在构建时无法知道答案,而在运行时又想知道答案时。+1只是为了教我一些我不知道的东西。。。但是,OP必须用数组的实际大小声明函数本身,因此您的解决方案在实际解决手头的问题方面几乎没有作用。@AmadeusDrZaius:这个答案太荒谬了!这根本没用。如果知道数组是10大,则不需要函数。如果不是10大,它就不能工作。@AmadeusDrZaius您的第一个解决方案至少在其极其有限的用例中是可以接受的。这个基于全局的解决方案非常糟糕,我可以用多线程代码轻松地打破它<代码>无符号长数组大小(字符*p;大小\u t长度)是使用通用数组解决此问题的唯一有效方法,并且提供eckes建议的哨兵也是合理的。。。。或者使用特殊的数组结束标记(例如空指针)+1作为传递长度。最好将这个答案和haccks给出的答案合并。@eckes,我给了haccks支票,因为他/她已经包括了这个。不过,这两个答案都很好。正如我在评论中提到的,哨兵+1。@eckes;对这是唯一的办法:)不是唯一的办法。阿沙林的答案也是有效的。@eckes在阿马德乌斯的辩护中,他的答案对他的用例是有效的。问题是他的用例不是任何人都会遇到的问题,而是你和其他人回答的更一般的用例才是人们所问的真正问题。OT:不过,至少还是
int main(void)
。内存/数组大小最好输入
size\u t
而不是
int
#include <stdio.h>

int size(int *a)
{
    int count = 0;
    while(*a++ != -1)
        count++;
    return count + 1;
}
int main(void)
{
    signed int a[] = { 3, 5, 7, 9, 10, -1};

    printf("size of array is: %d\n", size(a));
}