我是靠谱客的博主 整齐大侠,最近开发中收集的这篇文章主要介绍c语言外部调用char数组,c语言可变数组char[]的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

看到同事一段接口代码,一脸懵逼,有这样一个结构体

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[]的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部