Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C sizeof(数组)是如何工作的_C_Arrays - Fatal编程技术网

C sizeof(数组)是如何工作的

C sizeof(数组)是如何工作的,c,arrays,C,Arrays,c如何在运行时找到数组的大小?关于数组大小或数组边界的信息存储在哪里 sizeof()仅适用于固定大小的数组(可以是静态的、基于堆栈的或在结构中) 如果将其应用于使用malloc(或C++中的新代码)创建的数组,您将始终获得指针的大小 是的,这是基于编译时信息。sizeof(Array)是在编译时查找的,而不是在运行时。该信息未被存储 您是否对实现边界检查感兴趣?如果是这样的话,有很多不同的方法可以实现这一点。sizeof给出变量的大小,而不是指向的对象的大小(如果有)。sizeof(array

c如何在运行时找到数组的大小?关于数组大小或数组边界的信息存储在哪里

sizeof()
仅适用于固定大小的数组(可以是静态的、基于堆栈的或在结构中)

如果将其应用于使用
malloc
(或C++中的新代码)创建的数组,您将始终获得指针的大小

是的,这是基于编译时信息。

sizeof(Array)是在编译时查找的,而不是在运行时。该信息未被存储


您是否对实现边界检查感兴趣?如果是这样的话,有很多不同的方法可以实现这一点。

sizeof
给出变量的大小,而不是指向的对象的大小(如果有)。
sizeof(arrayVar)
仅当
arrayVar
在范围中声明为数组而不是指针时,才会返回以字节为单位的数组大小

例如:

char myArray[10];
char* myPtr = myArray;

printf("%d\n", sizeof(myArray)) // prints 10 
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine)
sizeof(array)
完全由C编译器实现。当程序被链接时,对您的
sizeof()
调用已转换为常量

示例:编译此C代码时:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
    int a[33];
    printf("%d\n", sizeof(a));
}

<代码> $ 132 /COD>中间是数组的大小,132=4×33。请注意,没有<代码>调用sieOS/<代码>指令-不像<代码> Prtff<代码>,这是一个真正的函数。

siZeof是C++之前和C中的纯编译时间。从C99开始,有可变长度数组:

// returns n + 3
int f(int n) {
    char v[n + 3];

    // not purely a compile time construct anymore
    return sizeof v;
}

这将计算操作数的
sizeof
,因为编译时还不知道
n
。这只适用于可变长度数组:其他操作数或类型仍在编译时进行sizeof计算。特别是,在编译时已知的数组仍然像C++和C89一样处理。因此,
sizeof
返回的值不再是编译时常量(常量表达式)。您不能在需要这样一个值的地方使用它,例如在初始化静态变量时,除非编译器特定的扩展允许它(C标准允许实现对它视为常量的内容进行扩展)

固定大小的数组不一定基于堆栈。C没有新的运算符。您已经忘记了C99 VLA-可变长度数组。很好,您提到了C99 VLA。然而,您的答案应该强调,即使在C99中,固定大小的数组也会在编译时计算它们的大小——只有VLA会在运行时计算它们的大小。也许,作为一个结果,在C99中,你不能总是使用'sizeof(array)'作为常量。好了,现在我该睡觉了。稍后,我会醒来并对我的答案中的所有这些错误尖叫:p+1用于区分C99中
sizeof
的编译时和非编译时求值,但可变长度数组的长度实际上是如何计算的?它是存储在数组描述符还是什么的?你能解释一下为什么前一个会给出10吗?这是在堆栈中还是在堆中?不管它是在堆栈中还是在堆中(尽管要在堆中,它必须嵌入到
struct
定义中)。关键是变量
myArray
被声明为数组,而不是指针。因此,编译器看到声明了一个包含10个字符的数组,并分配了10个字节的存储空间来保存这10个字符;它分配4个字节来保存
myPtr
(在32位机器上),但不分配任何存储空间供其指向。
myPtr
没有自己独特的存储数据的内存,而是指向为
myArray
分配的内存。这有用吗?
// returns n + 3
int f(int n) {
    char v[n + 3];

    // not purely a compile time construct anymore
    return sizeof v;
}