一个关于结构体和字符数组的有关问题

一个关于结构体和字符数组的问题
#include<iostream>
using namespace std;
struct A
{
int n;
char s;
};
main (){
char *str={"hello,world"};
struct A *a=(struct A*)str;
printf("%c\n",a->s);

}

输出的是o


为什么
#include<iostream>
using namespace std;
struct A
{
int n;
char s[1];
};
main (){
char *str={"hello,world"};
struct A *a=(struct A*)str;
printf("%c\n",a->s);

}
输出的是$
struct c 字符

------解决方案--------------------
第一个
INT N占用4字节,char类型占用1个字节
所以打招呼依照顺序,S会得到Ø

第二个
一样,INT N,占用4字节,
但是char类型[1]是阵列,再结构中所放的是指标,所以是4字节
依照顺序,S[1]的内容是“邻,窝”转成十六进制的值所指向的位置
------解决方案--------------------
1. 邪恶的类型转换,后果自负!!
char *str={"hello,world"};
struct A *a=(struct A*)str;


2. 
struct A
{
int n;
char s;
};

A a;
//a.s是对象a的成员s.的值,类型是char
printf("%c", a.s);//这里相当于int t = a.s; char c = (char)t; 最后输出c



3. 
struct A
{
int n;
char s[1];
};

A a;
//a.s是对象a的成员s的地址,类型是char*
printf("%c", a.s);//这里相当于int t = (int)a.s; char c = (char)t; 最后输出c