C语言变长数组 struct中char data[0]的用法详解

 更新时间:2017年01月09日 09:41:19   投稿:jingxian  
下面小编就为大家带来一篇C语言变长数组 struct中char data[0]的用法详解。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用struct实现变长数组的技术。下面是我在网上找到的一篇讲解很清楚的文章。

在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。

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 <iostream> 
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

PS:必须将指针定义在struct的末尾,指针的类型也可以不为char。

以上这篇C语言变长数组 struct中char data[0]的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++实现LeetCode(148.链表排序)

    C++实现LeetCode(148.链表排序)

    这篇文章主要介绍了C++实现LeetCode(148.链表排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言利用面试真题理解指针的使用

    C语言利用面试真题理解指针的使用

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-08-08
  • VisualStudio 使用Visual Leak Detector检查内存泄漏

    VisualStudio 使用Visual Leak Detector检查内存泄漏

    这篇文章主要介绍了VisualStudio 使用Visual Leak Detector检查内存泄漏的相关资料,需要的朋友可以参考下
    2015-07-07
  • 在Vitis IDE中如何使用第三方库 libtiff 保存 tiff 文件

    在Vitis IDE中如何使用第三方库 libtiff 保存 tiff 文件

    这篇文章主要介绍了在Vitis IDE中如何使用第三方库 libtiff 保存 tiff 文件,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • C++无法打开源文件bits/stdc++.h的问题

    C++无法打开源文件bits/stdc++.h的问题

    这篇文章主要介绍了C++无法打开源文件bits/stdc++.h的问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++ 命名空间--namespace总结

    C++ 命名空间--namespace总结

    namespace中文意思是命名空间或者叫名字空间,下面这篇文章主要给大家介绍了关于C++中名称空间namespace使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
    2021-09-09
  • C 语言基础教程(我的C之旅开始了)[七]

    C 语言基础教程(我的C之旅开始了)[七]

    C 语言基础教程(我的C之旅开始了)[七]...
    2007-02-02
  • C语言函数的参数使用指针

    C语言函数的参数使用指针

    这篇文章主要介绍了C语言函数的参数使用指针,本文讲述了指针在作为函数参数时候的使用方法,解析值传递和值引用的区别案例,希望对你有所帮助
    2021-06-06
  • 深入解读C++中的指针变量

    深入解读C++中的指针变量

    这篇文章主要介绍了深入解读C++中的指针变量,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++ std::copy与memcpy区别小结

    C++ std::copy与memcpy区别小结

    本文主要介绍了C++ std::copy与memcpy区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05

最新评论