【问题标题】:length of a 2-D char array in a function函数中二维字符数组的长度
【发布时间】:2023-04-09 21:02:01
【问题描述】:

这是一个小代码sn-p。在函数 g() 中,有没有办法知道 a[] 中的字符串数,即在本例中为 4。

在 main 中,我可以借助 sizeof() 函数得到这个,但是因为我将地址传递给函数 g() 并且我的电脑是 64 位的,所以 g() 中的 sizeof(a) 是 8指针的大小,但我必须知道字符串的数量。

void g(char *a[])
{
    printf("%d\n",sizeof(a)/sizeof(a[0]));
}
int main()
{
    char *a[]={"1","2","3","4"};
    printf("%d\n",sizeof(a)/sizeof(a[0]));
    g(a);
}

【问题讨论】:

  • 选择一种语言。是的,您可以使用g 作为模板,通过非类型参数推导在 C++ 中对固定数组执行此操作,不传递长度就无法在 C 中执行此操作。
  • 有趣的问题。真的。
  • sizeof 不是函数,顺便说一句,它是一个运算符

标签: c++ c


【解决方案1】:

关于 SO 已经有许多非常相似的问题,它们解释了数组是什么,它们如何传递给函数,以及含义是什么。 This one, for example 应该为您提供足够的信息来解决这个问题......仍然:

你不能这样做,反正也不可靠。一旦将数组传递给函数,它就会衰减为指针(在 64 位平台上其大小为 8,在 32 位平台上为 4)。您的函数参数char *a[] 是所谓的不完整类型。它指定了一个指针数组,但该数组的长度未指定。你可以做的是完成类型:

void g(char *a[4])
{}

在这种情况下,您的代码可以工作,但这有点危险,因为调用函数时可能会使用不同长度的数组。

更常见的是要求传递第二个参数(通常为size_t),它指定传递的数组的长度:

void g(char *a[], size_t arr_len)
{}

这个函数是这样调用的:

g(an_array, sizeof an_array/ sizeof *an_array);

an_array 当然是一个数组,sizeof an_array 是它的大小(以字节为单位)除以数组中值的类型大小。 sizeof *an_array 是写sizeof an_array[0] 的另一种方式。它还依赖于数组在大多数情况下衰减为指针这一事实,并且由于 C 标准将 array[0] 指定为与​​ *(array + 0) 相同,因此它们是可以互换的......

只是一个挑剔:你可能想改变这个:

char *a[]={"1","2","3","4"};

对于您在此处实际声明和初始化的内容:

const char *a[]={"1","2","3","4"};

a 中的char * 是常量,因为它们驻留在只读内存中,所以无法更改,最好要么自己分配内存,要么写入 p>

char a[][] = {"1", "2", "3", "4"};

将字符串复制到 RW 内存中

【讨论】:

  • 谢谢你的回复,其实我是在解决一个在线比赛,我已经解决了除了这部分之外的主要部分,http://www.techgig.com/codegladiators/openparticipation/dashboardeasy level。我现在不知道该怎么办:(
【解决方案2】:

在 C 中,您需要将数组的大小传递给函数或使用标记值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多