初始化字符数组 - C 和 C++
initialize char array - C and C++
有人问我这个语法是什么意思:
char data[32] = {1};
但是我不记得它做了什么,但我记得它是有效的。
谁能解释它的目的?
这将创建一个包含 32 个字符的数组。第一个元素将为 1,其余元素将设置为零。
如果根本不初始化自动数组(本地和非静态),则数组的元素可能包含垃圾值。
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
char data[5];
for (i = 0; i < 5; i++) {
printf("data[%d] = %dn", i, data[i]);
}
return 0;
}
输出:
data[0] = 72
data[1] = 12
data[2] = -118
data[3] = 51
data[4] = -119
但是,如果您确实对其进行了初始化,它将使用您指定的初始值设定项进行初始化。如果初始值设定项的数量小于数组中元素的总数,则其余元素将初始化为 0。
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
char data[5] = {1};
for (i = 0; i < 5; i++) {
printf("data[%d] = %dn", i, data[i]);
}
return 0;
}
输出:
data[0] = 1
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0
它是初始化。它将数组中值为 1
的第一个元素设置为 ( ^A
在我检查的 ASCII 表中),其余元素设置为 0
(默认值)。
要在省略的初始值设定项上声明 C99 标准,请执行以下操作:
如果大括号括起来的列表中的初始值设定项少于元素或成员的数量 聚合,或字符串文本中用于初始化已知数组的字符较少 大小比数组中有元素,聚合的其余部分应 隐式初始化与具有静态存储持续时间的对象相同。
和:
如果未显式初始化具有自动存储持续时间的对象, 它的价值是不确定的。如果具有静态存储持续时间的对象是 未显式初始化,则:
- 如果它具有指针类型,则将其初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则(递归)初始化每个成员;
- 如果是联合,则根据这些初始化(递归)第一个命名成员 规则。
char
是算术类型,因此数组的其余元素将初始化为零。
是的,你没记错。 只需谷歌"C数组初始化":
- http://www.eskimo.com/~scs/cclass/notes/sx4aa.html
几点注意事项:
在较旧的 ANSI C 编译器下,您不能总是提供 函数内"本地"数组的初始值设定项;你只能 初始化"全局"数组,即任何函数之外的数组。那些 编译器现在很少见,所以你不必担心这一点 区别再也好了。
当数组定义包含初始值设定项时,数组 维度可以省略,编译器会推断维度 从初始值设定项的数量
如果初始值设定项少于数组中的元素,则 其余元素将自动初始化为 0。
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存