一些事情。
当我用一个大小为3
的成员数组声明我的结构时,这是否意味着该数组有4个元素? 0,1,2,3?为什么他们,当我尝试插入字符A
,B
和C
时,它会告诉我initializer-string for array of chars is too long [-fpermissive]
?
#include <iostream>
using namespace std;
struct Student {
double no;
char grade[3];
};
int main() {
struct Student harry = {975, "ABC"};
}
当我打印字符数组的特定索引的地址时,我从以下代码中得到以下结果:
struct Student {
double no;
char grade[4];
};
int main() {
struct Student harry = {975, "ABC"};
for (int i = 0; i < 4; i++)
cout << "h.g[" << i << "]" << harry.grade[i] << endl;
for (int i = 0; i < 4; i++)
cout << "h.g[" << i << "]" << &harry.grade[i] << endl;
}
结果:
h.g[0]A
h.g[1]B
h.g[2]C
h.g[3]
&h.g[0]ABC
&h.g[1]BC
&h.g[2]C
&h.g[3]
为什么第一个索引会打印ABC
,然后打印BC
,而不是像第一个循环一样分别打印每个字符?
答案 0 :(得分:3)
不,声明像T arr[3]
这样的数组会给你一个包含3个元素的数组,而不是4.声明中的3是数组的大小。指数从0开始,因此元素的指数为0,1和2。
字符串文字"ABC"
为您提供“4 const char
数组”,其中最后一个元素是空字符。如果您尝试使用包含太多字符的字符串文字初始化数组,则您的程序格式不正确:
没有比数组元素更多的初始化器。
在第一个循环中,您将获取阵列的每个字符并将其打印出来。当您打印char
时,您只获得char
作为输出。
当您使用&harry.grade[i]
获取数组元素的地址时,会得到char*
。输出char*
时,I / O库将其视为C样式的以null结尾的字符串。它将从该字符输出到它找到的第一个空字符。这就是为什么你得到位置i
的角色和跟随它的角色。
答案 1 :(得分:1)
当我用大小为3的成员数组声明我的结构时,这不意味着该数组有4个元素吗? 0,1,2,3?
不,这意味着它有三个元素,您可以使用索引0,1,2。
访问它们为什么第一个索引打印ABC,然后是BC等,而不是像第一个循环那样分别打印每个字符?
您正在超出数组的范围进行访问,这会导致未定义的行为。这意味着一切都可能发生。您还要将size-4字符数组
char数组“ABC”中的第4个元素是空终止"ABC"
分配给size-3数组。所以你没有读取和写入访问权限。\0
。当您使用char[N]
打印std::cout
的任何元素的地址时,它会看到char*
,它将其解释为以空字符结尾的字符串。因此它会将字符打印到空终止。因此,如果您从头开始打印,则会获得A, b, C
。如果从第二个元素打印,则会得到B,C
,依此类推。