【问题标题】:Size of char pointer array from function函数中字符指针数组的大小
【发布时间】:2013-08-29 11:30:55
【问题描述】:

使用此代码:

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

【问题讨论】:

  • 数组衰减为指针。您在第一个示例中获得了指针的大小。
  • 这不是重复的。我问的是为什么给出不同的答案,而不是如何获取数组中元素的数量。

标签: c arrays pointers char size


【解决方案1】:
  1. 这是因为 char *messages[] 只是 char **messages 的语法糖,所以您获得的只是指针的大小,而不是整个数组的大小。

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

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

【讨论】:

  • 感谢您的回答,但我仍然不明白为什么两者给出的数字不同。
  • 您阅读了链接吗?具体6.21?这确实是正是你的问题。
【解决方案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() 中的答案。

【讨论】:

  • 更清晰的答案,直接与我的要求相关(没有粗鲁)。谢谢,标记为正确。
  • 一个小问题,写 (char **messages) 而不是 (char *messages[]) 是否更好,因为第一个只会衰减到第二个。
  • 这是一场宗教战争。有人说char** messages 更好,因为它更准确地代表了被调用函数接收到的参数。其他人说char* messages[] 更好,因为它更准确地表示从调用函数的角度来看参数是什么。我在宗教战争中不偏袒任何一方。 :-)
猜你喜欢
  • 2013-06-20
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2011-11-28
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多