结构体内数组大小不定

来源:互联网 发布:js dom事件 编辑:程序博客网 时间:2024/05/13 13:26

/***********今天写代码时候遇到一个问题需要写到结构体数组成员里面,觉得提前分配全局变量数组太大,用时分配再说************/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Test 
    int Msgtype; 
    char szMsg[]; 
}; 
 
int main(void
{    
    int a = 0;
    struct Test t; 
    t.Msgtype = 45; 
    strcpy(t.szMsg , "b"); 
    printf("%s, %d\n", t.szMsg, a);
    printf("%#x, %#x\n", &a, t.szMsg);
 
    return 0; 
这段代码,发现是有问题的。

先说明下这个结构体

struct Test 
    int Msgtype; 
    char szMsg[]; 
}; 
网上找到说明char szMsg[]; 这个特性是C99特有的一个新特性,称为伸缩型数组成员。利用这一特性可以声明最后一个成员是一个具有特殊属性的数组的结构。


这个结构体sizeof(struct Test )大小只有4,说明 char szMsg[];没有分配内存的。

所以只能用时在堆里面分配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Test 
    int Msgtype; 
    char szMsg[]; 
}; 
 
int main(void
{    
    int a = 0;
    struct Test t; 
    t.Msgtype = 45; 
    strcpy(t.szMsg , "b"); 
    printf("%s, %d\n", t.szMsg, a);
    printf("%#x, %#x\n", &a, t.szMsg);
 
    return 0; 

上面代码结果用gcc编译打印出来会是a = 98,即ascii吗b的值。

  strcpy(t.szMsg , "bcde"); 
就会出现段错误。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tpyedef struct 
    int Msgtype; 
    char szMsg[]; 
}Test; 
 
int main(void
{    
    int a = 0;
    Test *t = (Test*)malloc(sizeof(int)+20*sizeof(char)); 
    t->Msgtype = 45; 
    strcpy(t->szMsg , "bcd"); 
    printf("%s, %d\n", t.szMsg, a);
    printf("%#x, %#x\n", &a, t.szMsg);
 
    return 0; 
这样改正就ok了。






原创粉丝点击