-2

使用此代码:

#include <stdio.h>

void printSize(char *messages[]) {
    printf("%d", sizeof(messages) / sizeof(char *));
}

int main(void) {

    printf("Size when through passing direct to function: ");
    printSize((char *[]){"Zero", "One", "Two", "Three"});
    printf("\n");

    printf("Size when calculating in main: %d\n", sizeof((char *[]){"Zero", "One", "Two", "Three"}) / sizeof(char *));

    return 1;
}

我得到输出:

Size when through passing direct to function: 1
Size when calculating in main: 4

我知道没有办法在 char* 数组中获得正确数量的元素,但我很好奇为什么它们会给出不同的结果。

4

2 回答 2

4
  1. 这是因为char *messages[]is 只是语法糖char **messages,所以你只是得到指针的大小,而不是整个数组的大小。

  2. 如果不将大小作为另一个参数传递,则不能。

您应该查看关于Arrays & Pointers的 comp.lang.c FAQ 部分。

于 2013-08-26T21:25:53.947 回答
3

当您使用数组作为函数的参数时,它“衰减”为指向数组第一个元素的指针。因为messages是一个指向 的指针数组char,所以当数组传递给函数时,它变成了指向 char 指针的指针。即使您在参数列表中将其指定为数组,也会发生这种情况;这就是语言的工作方式。

所以在 中void printSize(),当你使用 时sizeof(messages),你会得到一个指针的大小。您将其除以另一个指针的大小sizeof (char*)。在您的系统上,两种情况下指针的大小都是 4 字节,因此您得到的结果是 4 / 4,即 1。

但是,在main()中,您的数组char*被定义为并被视为数组。当sizeof()运算符应用于数组时,您将获得整个数组中所有字节的大小。这是什么数组?它是一个由四个指向char. 每个指针的大小为 4。因此数组的总大小为 4 * 4 = 16 字节。您将此 16 除以指向 char 的单个指针的大小,即 4。所以您得到的结果是 16 / 4,即 4 作为main().

于 2013-08-26T21:41:17.143 回答