概述
看到同事一段接口代码,一脸懵逼,有这样一个结构体
typedef struct cache_rsp{
int ret;
unsigned int len;
char data[0];
}cache_rsp_t;
这个结构体的设计是用来接收服务器报文回复数据的,接收的数据存放在data这个字段中,我是小白,不能理解,怎么都看不懂。
终于在一番百度之后,查找的到了这种结构体用法,以下是转载内容:
struct MyData
{
int nLen;
char data[0];
};
开始没有理解红色部分的内容,上网搜索下,发现用处很大,记录下来。
在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
实际用时采取这样:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
这样就可以通过p->data 来操作这个str。
示例:
#include
using namespace std;
struct MyData
{
int nLen;
char data[0];
};
int main()
{
int nLen = 10;
char str[10] = "123456789";
cout << "Size of MyData: " << sizeof(MyData) << endl;
MyData *myData = (MyData*)malloc(sizeof(MyData) + 10);
memcpy(myData->data, str, 10);
cout << "myData's Data is: " << myData->data << endl;
free(myData);
return 0;
}
输出:
Size of MyData: 4
myData's Data is: 123456789
由于数组没有元素,该数组在该结构体中分配占用空间,所以sizeof(struct Mydata) = 4。
malloc申请的是14个字节的连续空间,它返回一个指针指向这14个字节,强制转换成struct INFO的时候,前面4个字节被认为是Mydata结构,后面的部分拷贝了“123456789”的内容。
在读程序中经常会看到这样的定义char data[0],这是一个什么样的用法,有什么好处,在哪些地方用到?
本文的主要目的就是阐明这个定义的作用,以及适用范围,这需要对指针的概念和操作系统的内存模型有一个情形的认识。
首先看一段程序:
#include
#include
#include
typedef struct _Info
{
int i;
char data[0];
}Info;
int main(int argc, char* argv[])
{
printf("%d/n",sizeof(Info));
return 0;
}
程序的执行结果是:4。整数i就占了4个字节,这表明data没有占用空间。data是一个数组名;该数组没有元素;该数组的真实地址紧随结构体Info之后;这种声明方法可以巧妙的实现C语言里的数组扩展。
记住上面的结构体不同于:
typedef struct _Info
{
int i;
char* data;
}Info;
这个结构体占用8个字节的空间,因为指针类型要占用4个字节的空间。
再看一个例子:
#include
#include
#include
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;
}
程序的执行结果见下图:
可知,data的地址是紧随结构体之后的。
————————————————
版权声明:本文为CSDN博主「maopig」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
以上是原博主的文章内容
在这里想说几句,有人你转载就转载把,非要写自己原创,一个字都不动的扒过来,你好意思吗?可有脸?
这篇文章,我见过最早的版本是2012年的,之后都是复制的,还标原创,真是无耻。
以下是个人对char[]使用的一些心得:
一般我们会定义一张表来存放数据,然后将该表的数据结构强转为char*,结构体的类型强转char*并不会影响数据。而且,较多的时候,表中存放的是一个列表数据,那么,我们不需要建一个列表,然后再进行转换,只需要这样做
get_dump_list_rsp_t* p = NULL;
arraycounts = cJSON_GetObjectItem(res_json,"totalRows")->valueint;
p = malloc(sizeof(get_dump_list_rsp_t)* arraycounts);
for(i = 0;i < arraycounts;i++){
cJSON* item = cJSON_GetArrayItem(cont,i);
strcpy(p[i].id,cJSON_GetObjectItem(item,"id")->valuestring);
strcpy(p[i].filename,cJSON_GetObjectItem(item,"filename")->valuestring);
p[i].filetype = cJSON_GetObjectItem(item,"filetype")->valueint;
p[i].uptime = cJSON_GetObjectItem(item,"uptime")->valueint;
p[i].filesize = cJSON_GetObjectItem(item,"filesize")->valueint;
}
strcpy(rsp.data,(char*)p);
实现了数组数据的存储和强转。
最后
以上就是整齐大侠为你收集整理的c语言外部调用char数组,c语言可变数组char[]的使用的全部内容,希望文章能够帮你解决c语言外部调用char数组,c语言可变数组char[]的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复