struct MyData
{
int nLen;
char data[0];
};
1.这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
2.初始化时为:
MyData *p = (struct MyData *)malloc(sizeof(struct MyData) + strlen(str))
3.练习
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _Info
{
int i;
char data[0];
}Info;
int main(int argc, char* argv[])
{
char buf[10] = "123456789";
void* p = NULL;
printf("%d\n",sizeof(Info));
Info* info = (Info*)malloc(sizeof(Info) + 10);
p = (void*)info->data;
printf("addr of info is %p. addr of data is %p .\n", info, p);
strcpy((char*)p, buf);
printf("%s\n", (char*)p);
return 0;
}
4.字符串打印
#include<stdio.h>
int main()
{
/*三种存放方法*/
char d[] = { 'i', ' ', 'l', 'o', 'v', 'e', ' ', 'y', 'o', 'u' };
char s[] = "i love you"; //将字符串存放于一个char型的数组
char *p = "i love you";
printf("%s\n", s); //正确输出 1
printf("%s\n", p); //正确输出 2
printf("%s\n",d); //错误输出
for (int i = 0; i<sizeof(d)/sizeof(d[0]); i++) //正确输出 3
printf("%c", d[i]);
return 0;
}
其实原因就是在第一种存放中,末尾没有手动添加一个'\0'的字符,所以没有结束标志,就会乱码,第二种是因为字符串末尾会自动以'\0'结束,所以输出正确。
正确输出3则是一个一个打印出来,不需要添加'\0'。
char d[]={'i',' ','l','o','v','e',' ','y','o','u','\0'};
?5.各种结构体、数组 初始化
struct student_st
{
char c;
int score;
const char *name;
};
// method 1: 按照成员声明的顺序初始化
struct student_st s1 = {'A', 91, "Alan"};
show_student(&s1);
// method 2: 指定初始化,成员顺序可以不定,Linux 内核多采用此方式
struct student_st s2 =
{
.name = "YunYun",
.c = 'B',
.score = 92,
};
show_student(&s2);
// method 3: 指定初始化,成员顺序可以不定
struct student_st s3 =
{
c: 'C',
score: 93,
name: "Wood",
};
?
?
|