【问题标题】:Why is the sizeof() a char array sometimes sizeof(void *) and sometimes sizeof(the array)? [duplicate]为什么 sizeof() 有时是 char 数组 sizeof(void *) 有时是 sizeof(the array)? [复制]
【发布时间】:2013-09-26 17:02:30
【问题描述】:
#include<stdio.h>

void printS(char []);

int main(){
    char str[]="The C Programming Language"; 
    printf("%d \n",sizeof(str)); //output=27
    printS(str);
}

void printS(char s[]){
    printf("%d \n",sizeof(s)); //output=4
}

为什么会出现这种异常输出

请解释一下'str'和's'有什么区别...... 以及如何在 printS 函数中设置 sizeof() output=27。

【问题讨论】:

  • 在介绍类中,我们经常被教导数组是指针,指针是数组。这是不是正确的。它们在许多方面都相似,但并不相同。

标签: c sizeof


【解决方案1】:

当您将数组传递给像您这样的函数时,它将衰减为指针,因此sizeof 将返回指针的大小而不是数组的大小。 C Faq's section on Arrays and Pointers 是一个很好的参考,Question 6.4 涵盖了这个确切的问题。 C99 草案标准的相关部分是 6.3.2.1 Lvalues, arrays, and function designators 段落 3 部分,其中说(强调我的):

除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是 用于初始化数组的字符串字面量,具有“类型数组”类型的表达式是 转换为类型为“pointer to type”的表达式,该表达式指向 数组对象,并且不是左值。

为了获得 C 风格字符串的长度,您可以使用 string.h 头文件中的 strlen

【讨论】:

    【解决方案2】:

    sizeof() 的值是指定类型的一个变量的大小。 s 实际上是 char*,所以 sizeof(s) 是 4(在您的 32 位平台上)。在main()中,str被视为一个char数组,所以sizeof(str)是数组的大小。注意“The C Programming Language”的长度是26,多出的一个字节是零终止符。

    要获取s 的长度,请使用strlen(s)。这次不计算零终止符。并且不要忘记在开头#include &lt;string.h&gt;

    【讨论】:

      【解决方案3】:

      C 没有传递数组值的特性。数组始终作为指针传递,当您声明 foo[] 类型的参数时,您实际上是在声明 foo *

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-12
        • 2019-02-12
        • 2018-03-05
        • 2014-05-25
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        相关资源
        最近更新 更多