Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 哪些内存位置用于变量存储_C_Memory - Fatal编程技术网

C 哪些内存位置用于变量存储

C 哪些内存位置用于变量存储,c,memory,C,Memory,更高级的语言,比如javascript,不会给程序员一个 选择变量存储的位置。但C是。我的问题是: 是否有关于存储变量(如依赖变量)的指南 在尺寸、用途等方面 据我所知,有三个可能的存储位置 数据(不包括用于实际代码的代码段): 数据段 堆叠 堆 那么瞬态小数据项应该存储在堆栈上吗 那么函数之间必须共享的数据项呢。这些 项目可以存储在堆上或数据段中。你怎么 决定选择哪一个?如果局部/堆栈变量较小,且经常使用,且范围相对较小/有限,则应优先选择局部/堆栈变量,而不是全局或堆变量。这将使编译器有更多

更高级的语言,比如javascript,不会给程序员一个 选择变量存储的位置。但C是。我的问题是: 是否有关于存储变量(如依赖变量)的指南 在尺寸、用途等方面

据我所知,有三个可能的存储位置 数据(不包括用于实际代码的代码段):

  • 数据段
  • 堆叠
  • 那么瞬态小数据项应该存储在堆栈上吗

    那么函数之间必须共享的数据项呢。这些 项目可以存储在堆上或数据段中。你怎么
    决定选择哪一个?

    如果局部/堆栈变量较小,且经常使用,且范围相对较小/有限,则应优先选择局部/堆栈变量,而不是全局或堆变量。这将使编译器有更多的机会使用它们来优化代码,因为编译器知道,除非传递指向它们的指针,否则它们不会在函数调用之间改变

    此外,堆栈通常相对较小,在其上分配大型结构或数组可能会导致堆栈溢出,尤其是在递归代码中

    另一个要考虑的是在多线程程序中使用全局变量。您希望最小化竞争条件的可能性,其中一种策略是不直接使用函数中的任何全局资源(如果

    malloc()
    是线程安全的,如果
    errno
    是每个线程的,等等,您当然可以使用它们)

    顺便说一句,使用局部变量而不是全局变量还可以提高代码的可读性,因为变量位于使用它们的位置附近,您可以快速找到它们的类型、使用位置和方式


    除此之外,如果您的代码是正确的,那么将变量设置为局部变量、全局变量或堆中变量之间应该没有太大的实际区别(当然,
    malloc()
    可能会失败,您应该记住:)。

    当这些变量很小时,您应该选择局部/堆栈变量而不是全局或堆变量,经常使用且范围相对较小/有限。这将使编译器有更多的机会使用它们来优化代码,因为编译器知道,除非传递指向它们的指针,否则它们不会在函数调用之间改变

    此外,堆栈通常相对较小,在其上分配大型结构或数组可能会导致堆栈溢出,尤其是在递归代码中

    另一个要考虑的是在多线程程序中使用全局变量。您希望最小化竞争条件的可能性,其中一种策略是不直接使用函数中的任何全局资源(如果

    malloc()
    是线程安全的,如果
    errno
    是每个线程的,等等,您当然可以使用它们)

    顺便说一句,使用局部变量而不是全局变量还可以提高代码的可读性,因为变量位于使用它们的位置附近,您可以快速找到它们的类型、使用位置和方式


    除此之外,如果您的代码是正确的,那么将变量设置为本地变量、全局变量或堆中变量之间应该没有太大实际区别(当然,
    malloc()
    可能会失败,您应该记住:)。

    C只允许您指定间接存储数据的位置。。。通过变量和/或分配的范围。i、 例如,函数的局部变量通常是堆栈变量,除非它被声明为静态变量,在这种情况下,它可能是DATA/BSS。通过new/malloc动态创建的变量通常是heap

    然而,这些都不能保证。。。只有它的含义


    也就是说,有一件事肯定是个坏主意,那就是在函数中声明大型局部变量。。。奇怪错误和堆栈溢出的常见来源。非常大的数组和结构最适合动态分配,并根据需要将指针保留在本地/全局中。

    C只允许您指定数据间接存储的位置。。。通过变量和/或分配的范围。i、 例如,函数的局部变量通常是堆栈变量,除非它被声明为静态变量,在这种情况下,它可能是DATA/BSS。通过new/malloc动态创建的变量通常是heap

    然而,这些都不能保证。。。只有它的含义


    也就是说,有一件事肯定是个坏主意,那就是在函数中声明大型局部变量。。。奇怪错误和堆栈溢出的常见来源。非常大的阵列和结构最适合动态分配,并根据需要将指针保留在本地/全局中。

    您正通过望远镜的错误一端进行观察。您没有指定存储变量的特定内存段(特别是因为“内存段”的概念高度依赖于平台)

    在C代码中,根据对代码有意义的内容,以及编译器将生成机器代码以将对象存储在适当的段中(如果适用)来决定变量的生存期、可见性和可修改性

    例如,在文件范围内(任何函数之外)或使用关键字
    static
    声明的任何变量都将具有静态存储持续时间,这意味着它们在程序启动时分配,并一直保持到程序终止;这些对象可以在数据段或bss段中分配。在没有
    static
    关键字的函数或块中声明的变量具有自动存储持续时间,并且(通常)在堆栈上分配

    字符串文本和其他编译时常量对象通常(但不总是!)分配在只读段中。像
    3.14159
    这样的数字文字和像
    'A'
    这样的字符常量不是对象,也不是(通常)