函数中char指针数组的大小

时间:2013-08-26 21:21:41

标签: c arrays pointers char size

使用此代码:

#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 *数组中获得正确数量的元素,但我很好奇它们为什么会给出不同的结果。

2 个答案:

答案 0 :(得分:4)

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

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

  3. 您应该查看Arrays & Pointers上的comp.lang.c常见问题解答部分。

答案 1 :(得分:2)

当您使用数组作为函数的参数时,它会“衰减”到指向数组第一个元素的指针。由于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()中的答案。