关于c构造体的困惑

关于c结构体的困惑
     我是学java的,最近对网络编程很感兴趣, 所以就买了本linux网络编程方面的书, 看到里面的c代码, 直接将一个字符数组强制转换为 结构体指针,这让我有点迷糊(当然我的c水平有限)。 于是就整个小demo,以为会得到预想的结果,但运行后发现我的想法是错的, 以下是例子, 望高手解答

struct Anode{
char a[2];
char b[2];
};
char *name = "john";
    struct Anode *node = (struct Anode *)name;
    printf("a:%s\n", node->a);
    printf("b:%s\n", node->b);

我期待的输出是
a:jo
b:hn

但是实际输出是
a:john
b:hn

为什么 node->a 的值是john呢? a的长度只有2呀
c struct

------解决方案--------------------
 printf才不管你数组长度是多少,一直输出到字符串结束符'\0'为止。
------解决方案--------------------
引用:
引用:我是学java的,最近对网络编程很感兴趣, 所以就买了本linux网络编程方面的书, 看到里面的c代码, 直接将一个字符数组强制转换为 结构体指针,这让我有点迷糊(当然我的c水平有限)。 于是就整个小demo,以为会得到预想的结果,但运行后发现我的想法是错的, 以下是例子, 望高手解答

struct Anode{
char a[2……



------解决方案--------------------
其实要想达到你想要的结果,可以:

        ...
struct Anode{
char a[2+1];
char b[2+1];
};
        ...
Anode stNode;
memset(&stNode, 0, sizeof(Anode));
strncpy(stNode.a, name,2);
name += 2;
strncpy(stNode.b, name,2);

printf("a:%s\n", stNode.a);
printf("b:%s\n", stNode.b);

------解决方案--------------------
struct Anode *node = (struct Anode *)name;
这句强制转换只是将name的首地址,赋给一个Anode类型的指针变量node而已。对于name本身并没有啥变化。另外C风格的字符串处理一般都以一个结束符'\0'做为结束标记,所以,例如:
char *p = "abcd";  // 注意末尾隐含有结束符
printf("%s" ,p);   // 输出 abcd
printf("%s" ,p+2)  // 从p首地址+2的位置输出 cd
------解决方案--------------------
引用:
我是学java的,最近对网络编程很感兴趣, 所以就买了本linux网络编程方面的书, 看到里面的c代码, 直接将一个字符数组强制转换为 结构体指针,这让我有点迷糊(当然我的c水平有限)。 于是就整个小demo,以为会得到预想的结果,但运行后发现我的想法是错的, 以下是例子, 望高手解答

struct Anode{
char a[2];
char b[2……


你的结果是正确的,%s遇到 0才结束 a从“john”的j的开始 b从h开始
------解决方案--------------------
引用:
引用:我是学java的,最近对网络编程很感兴趣, 所以就买了本linux网络编程方面的书, 看到里面的c代码, 直接将一个字符数组强制转换为 结构体指针,这让我有点迷糊(当然我的c水平有限)。 于是就整个小demo,以为会得到预想的结果,但运行后发现我的想法是错的, 以下是例子, 望高手解答

struct Anode{
char a[2……

的确a[0] = 'j' a[1] = 'h'

引申出一个常见的错误
type func(...)
{
    char array[x] = ".......";
    printf("%s\n",array);
}
这种做法和
    char *array = "......"
是有区别的.
------解决方案--------------------
那意思是 a数组的内容其实还是 "jo"了? 也就是a[0]=='j' && a[1]=='o' 为true了
是这么回事,但是在打印的时候是以'\0'结束的,在内存中a和b中的内容是连续存放的,第一次打印a会将b中的东西一块打印出来,直到遇到了b[3]='\0'第二次打印打印b中的东西遇到'\0'停止。