【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明

标签:【VS开发】 【编程开发】


主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性。以及如何访问和利用memset赋值等操作。

直接给出代码说明:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> struct TEST
{
int id;
char name[2][10];
}; struct TEST2
{
int id;
char *name;
}; // 测试传参可行否
void changeName(TEST* test)
{
for (int i = 0; i < strlen(test->name[1])-1; i++)
{
test->name[1][i] = 'd';
}
} int main(int argc, _TCHAR* argv[])
{
TEST test = { 0, { "test1", "test2" } };
printf("size of struct = %d\n", sizeof(test)); TEST2 test2;
test2.name = (char*)malloc(20);
printf("size of struct = %d\n", sizeof(test2)); printf("%s\n", test.name[1]);
changeName(&test);
printf("%s\n", test.name[1]);
return 0;
}

size of struct = 24
size of struct = 8
test2
dddd2
请按任意键继续. . .

结构体中的数组内存空间跟其它变量是一致的,整个结构体在一片连续的内存中;而对于结构体中定义的指针,它其实就是一个指针变量,跟数组完全不同,所以上面定义的情况看,指针变量的大小也是4个字节,加上int型变量4个字节,总计8个字节。而指针变量后续动态申请的内存是存放在别的地方,跟这个结构体的内存不连续。如果直接对结构体进行清零操作,比如获取结构体指针的首地址,然后得出结构体的size,利用memset进行清零操作,那么很简单,定义为数组的结构体可以直接清零成功,而对于指针的结构体清零,则导致结构体中指针指向了0x0000即NULL指针。毫无疑问!

另外,关于函数传参,实际上不管是结构体还是基本变量比如int,参数都一样,传递变量的地址(&变量)到函数中就可以访问了。结构体也一样是变量,只不过是自己定义的数据结构而已,只要将结构体变量的地址传入,所有对地址的操作都是可以在函数间保存的。


2016-10-26 11:09

张朋艺 pyZhangBIT2010@126.com

【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明的更多相关文章

  1. C语言结构体中字符数组的问题

    第一个程序 #include <stdio.h> #include <string.h> typedef struct student { char name[10]; int ...

  2. c结构体里的数组与指针

    /* 訪问成员数组名事实上得到的是数组的相对地址.而訪问成员指针事实上是相对地址里的内容 */ struct buf_str { int length; char buf[0]; }; struct ...

  3. 驱动开发:内核遍历进程VAD结构体

    在上一篇文章<驱动开发:内核中实现Dump进程转储>中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descrip ...

  4. 【Swift学习】Swift编程之旅---类和结构体(十三)

    与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...

  5. C结构体中数据的内存对齐问题

    转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...

  6. file结构体中private_data指针的疑惑

    转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...

  7. file结构体中private_data指针的疑惑【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...

  8. sturct stat 结构体中 st_mode 的含义

    工作中遇到 else if( (s_buf.st_mode&S_IFMT) == S_IFDIR) return 2; else if( !(s_buf.st_mode&S_IFREG ...

  9. C++结构体中sizeof(1)

    sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...

随机推荐

  1. MySQL分组查询,查询出某一个字段的最新记录

    直接上案例...... 案例: 同一个表中,只想需要A.B.C的最新记录 第一种方案: 应该还很多方法......(暂时先这样.....) 

  2. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequences(DP)

    题目链接:http://codeforces.com/contest/1058/problem/E 题意:给出 n 个数,对于一个选定的区间,区间内的数可以通过重新排列二进制数的位置得到一个新的数,问 ...

  3. C# StmpClient使用 网络(四)

    发送邮件 //SmtpClient client = new SmtpClient("smtp.qq.com"); //client.EnableSsl = true; //cli ...

  4. 11 SaltApi

    1.APIS https://docs.saltstack.com/en/latest/topics/api.html 1.python client api 必须运行在master节点上 2. 一般 ...

  5. vue中前进刷新、后退缓存用户浏览数据和浏览位置的实践

    vue中前进刷新.后退缓存用户浏览数据和浏览位置的实践 2018年07月07日 11:58:40 大灰狼的小绵羊哥哥 阅读数:4492   vue中,我们所要实现的一个场景就是: 1.搜索页面==&g ...

  6. Unable to copy file, Access to the path is denied

    Unable to copy file, Access to the path is denied http://stackoverflow.com/questions/7130136/unable- ...

  7. 洛谷——P2058 海港

    题目传送 由于于题目保证输入的ti是递增的,所以发现当我们统计完一艘船的答案后,这个答案多少会对下一艘船的答案有贡献.同时还发现如果对每个艘船都记录他的乘客在整个数据出现的所有国籍中相应出现的次数,在 ...

  8. 微信小程序底层原理与运行机制类文章学习

    参考文档 小程序底层实现原理及一些思考 为了安全和管控, 双线程执行 Web Worker执行用户的代码; UI线程执行大部分的功能. 微信小程序架构原理 只通过mvvm模板语法动态改变页面, 不支持 ...

  9. mybatis中的foreach条件参数过多时,#和$效率比较

    在客户端查询都小于1秒. 测试: mybatis中in条件12.3万数据$ : 6051 ms# : 27045 ms 1.2万数据$ : 1154 ms# : 24387 ms 5 万数据$ : 2 ...

  10. 图解golang内存分配机制 (转)

    一般程序的内存分配 在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况: 以上是程序内存的逻辑分类情况. 我们再来看看一般程序的内存的真实(真实逻辑)图: Go的内存分配核心思想 G ...