将 malloc 与静态指针一起使用

Elh*_*haw 2 c malloc static pointers initialization

我知道声明一个 ststic 变量并以这种方式初始化它static int *st_ptr = malloc(sizeof(int));会生成一条编译错误消息(类型初始化元素不是常量),并通过以这种方式使用单独的语句来解决这个问题static int *st_ptr; st_ptr = malloc(5*sizeof(int));


我需要了解这种情况下初始化运算符和赋值运算符之间的区别?以及为什么这种方式可以解决问题?

Sou*_*osh 7

首先,让我们简单介绍一下initializationvs. assignment

\n\n
    \n
  • 初始化:
  • \n
\n\n

这用于指定对象的初始值。通常,这意味着仅在定义变量时才会进行初始化。初始化对象的值称为初始化程序。来自C11, 章6.7.9,

\n\n
\n

初始化器指定存储在对象中的初始值。

\n
\n\n
    \n
  • 任务:
  • \n
\n\n

赋值是在任何(有效)给定的执行时间点分配(或设置)变量的值。引用标准、章节6.5.16

\n\n
\n

赋值运算符将值存储在左操作数指定的对象中。

\n
\n\n

如果是简单的赋值(=运算符),

\n\n
\n

在简单的赋值中(= ) 中,右操作数的值被转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。

\n
\n\n
\n\n

也就是说,我认为您的查询与初始化有关static

\n\n

对于第一种情况,

\n\n
static int *st_ptr = malloc(sizeof(int)); \n
Run Code Online (Sandbox Code Playgroud)\n\n

引用自C11标准文件、章节\xc2\xa76.7.9,初始化,第 4 段,

\n\n
\n

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。

\n
\n\n

以及关于常数表达式,来自同一文档的第 6.6 章,(强调我的)

\n\n
\n

常量表达式不得包含赋值、递增、递减、函数调用、\n 或逗号运算符,除非它们包含在未求值的子表达式中。

\n
\n\n

显然,malloc(sizeof(int));不是一个常量表达式,所以我们不能用它来初始化static

\n\n

对于第二种情况,

\n\n
static int *st_ptr;\nst_ptr = malloc(5*sizeof(int));\n
Run Code Online (Sandbox Code Playgroud)\n\n

您没有初始化static对象。您将其保留为未初始化。下一条指令,您将分配返回值malloc()为其所以你的编译器不会产生任何抱怨。

\n