【问题标题】:Types, expressions and arrays dimensions [duplicate]类型、表达式和数组维度 [重复]
【发布时间】:2018-05-21 11:34:16
【问题描述】:

我在similar question 上回复了这个问题,该问题得到了广泛而直接的讨论。我想确定我给他们的解释是正确的。

例如,我的textbook 在练习 6.24 中指出,“sizeof 运算符可用于查找存储类型或表达式所需的字节数。当应用于数组时,它不会产生数组的大小。”

#include<stdio.h>

void f(int *a);

int main(){
    char s[] = "deep in the heart of texas";
    char *p  = "deep in the heart of texas";
    int a[3];
    double d[5];

    printf("%s%d\n%s%d\n%s%d\n%s%d\n",
        "sizeof(s) = ", sizeof(s),
        "sizeof(p) = ", sizeof(p),
        "sizeof(a) = ", sizeof(a),
        "sizeof(d) = ", sizeof(d));

    f(a);
    return 0;
}

void f(int *a){
    printf("In f(): sizeof(a) = %d\n", sizeof(a));
}

即便如此,它对我来说似乎并不那么明显。因此,我想与您简要讨论一下输出:

sizeof(s) = 27
sizeof(p) = 8
sizeof(a) = 12
sizeof(d) = 40
In f(): sizeof(a) = 8

然后:

sizeof(s) = 27

在这种情况下,27 是由s 组成的字节数,每个char 由一个字节组成。这与sizeof 的定义形成对比,因为它返回的似乎是数组的_size_。在这一点上,我认为char s[] = "deep in the heart of texas" 被视为表达式是否正确?

sizeof(p) = 8

在这里,我们有一个指针char *。由于 sizeof “查找存储类型所需的字节数”,我假设指针 char * 存储在 8 个字节的内存中。我说的对吗?

sizeof(a) = 12 and In f(): sizeof(a) = 8

这个案子让我特别不确定。我发现的唯一相关区别是,在 f() 中,数组 a 作为 parameter 传递:指向其基址的指针。和以前一样,指针存储在 8 个字节的内存中。我对么?如果是这样,12 必须被认为是存储表达式int a[3] 所需的内存量?

sizeof(d) = 40

同样,它似乎返回数组d 的维度,即每个8 字节的五个部分。但是,同样,我们不是在讨论数组,而是在考虑表达式double d[5]。对吗?

感谢您与我分享您的知识和经验!

【问题讨论】:

  • 我不认为该问题与您建议的问题重复。原因是他们没有表现出太多的研究努力,也没有谈论表达,就我而言,这是一个相关的论点。也许我错了。在这种情况下,我想确保下次做得更好。任何建议将不胜感激。
  • “当应用于数组时,它不会产生数组的大小”——通常当有人谈论数组的“大小”时,他们指的是数组中元素的数量。有了这个理解,这个陈述是正确的。对于char 的数组,恰好数组的大小也是存储数组所需的字节数,但对于其他类型则不必如此。
  • @DavidBowling 这是一个宝贵的守时,谢谢!

标签: c arrays pointers operators


【解决方案1】:

简单地说:

1) sizeof(s) = 27:包含 NUL 终止符的字符串长度。请注意,sizeof(char) 按标准为 1。

2) sizeof(p) = 8:系统上char* 的大小。

3) sizeof(a) = 12:在main 中,是的,这是数组中元素的数量乘以每个元素的大小。由此我们可以推断出sizeof(int)是4。

4) sizeof(d) = 40: sizeof(double) 乘以元素个数。

在函数f 中,传递的数组已衰减为指针类型。 sizeof(a) 最有可能是 8。标准并不坚持sizeof(char*)sizeof(int*) 相同,但我从未遇到过不是这种情况的台式电脑。

【讨论】:

  • 我很高兴看到我正朝着正确的解决方案前进。感谢您的综合而直接的回答!
【解决方案2】:

很多文字,我没有全部阅读,但这是我的答案:

char s[] = "deep in the heart of texas";   // sizeof = length of string + 1
char *p  = "deep in the heart of texas";   // sizeof is size of pointer = 8
int a[3];                                  // size of 3 ints
double d[5];                               // size of 5 doubles

f 中,你正确地声明它是获取一个指针,所以它的大小就是指针的大小。

就是这样……

【讨论】:

  • 感谢您的简洁回答!
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多