为了账号安全,请及时绑定邮箱和手机立即绑定

在函数中查找数组长度

在函数中查找数组长度

C
冉冉说 2019-07-09 15:36:27
在函数中查找数组长度在数组长度以下的程序中ar主要是正确的,但在temp它显示指向ar在我的电脑上是2(单位:sizeof(int)).#include <stdio.h>void temp(int ar[]) // this could also be declared as `int *ar`{     printf("%d\n", (int) sizeof(ar)/sizeof(int));}int main(void){     int ar[]={1,2,3};     printf("%d\n", (int) sizeof(ar)/sizeof(int));     temp(ar);     return 0;}我想知道如何定义函数,以便在函数中正确读取数组的长度。
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

没有“内置”方式来确定函数中的长度。不管你怎么通过arrsizeof(arr)将始终返回指针大小。因此,最好的方法是将元素数作为单独的参数传递。或者,您可以有一个特殊的值,例如0-1表示结束(就像它是这样的)。\0在字符串中,它们只是char [])。但当然,“逻辑”数组的大小是sizeof(arr)/sizeof(int) - 1


查看完整回答
反对 回复 2019-07-09
?
临摹微笑

TA贡献1982条经验 获得超2个赞

正如其他人所说,显而易见的解决方案是将数组的长度作为参数传递,还可以在数组的开头存储此值。

#include <stdio.h>void temp(int *ar){
    printf("%d\n", ar[-1]);}int main(void){
    int ar[]= {0, 1, 2, 3};
    ar[0] = sizeof(ar) / sizeof(ar[0]) - 1;
    printf("%d\n", ar[0]);
    temp(ar + 1);
    return 0;}


查看完整回答
反对 回复 2019-07-09
?
茅侃侃

TA贡献1842条经验 获得超21个赞

不要使用函数,请为此使用宏:

//Adapted from K&R, p.135 of edition 2.#define arrayLength(array) (sizeof((array))/sizeof((array)[0]))int main(void){
    int ar[]={1,2,3};
    printf("%d\n", arrayLength(ar));
    return 0;}

您仍然不能在像您这样的函数中使用此宏。temp因为其他人提到的原因,数组作为参数传递。

如果您想传递一个数据类型,可以选择定义一个同时具有数组和容量的类型:

typedef struct{
  int *values;
  int capacity;} intArray;void temp(intArray array){
  printf("%d\n", array.capacity);}int main(void){
    int ar[]= {1, 2, 3};
    intArray arr;
    arr.values = ar;
    arr.capacity = arrayLength(ar);
    temp(arr);
    return 0;}

这需要更长的时间来设置,但是如果您发现自己将它传递给许多函数,则非常有用。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 520 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信