【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. tar命令--数据解档(三)解压.tar.gz文件报错 gzip:stdin:not in gzip format

    毕竟是生产..... 提示以下信息:  gzip: stdin: not in gzip format  tar: Child returned status 1  tar: Error is not ...

  2. springBoot+websocket集群系列知识

    WebSocket简介和spring boot集成简单消息代理 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理 Spring Websocket实现向指定的用户发送 ...

  3. PHP解决h5页面跨域

    前端h5 页面请求后端接口会出现跨域, PHP 只需三行代码即可解决 //解决前端跨域(h5页面) header("Access-Control-Allow-Origin:*"); ...

  4. Intel Wireless AC9560 160MHZ 联网黄色感叹号的问题

    Intel Wireless 开始支持5G设备了,AC9560 160MHZ可以工作在5G模式了.新入的设备驱动程序升级到了最新版本,发现联网出现“黄色感叹号”,DHCP的IP地址获取正常,从无线路由 ...

  5. 北京清北 综合强化班 Day5

    T1 思路: 输入数据,sort一下, 如果a[i]>sum+1(前缀和) 那么sum+1就一定不会被拼出来, 然后输出即可. 上代码: #include <iostream> #i ...

  6. 图论小专题B

    2 树 2.1 树的定义 一个只有\(N-1\)条边,且任意两个点连通的图叫做树.通过这样定义的树往往是一棵无根树,而我们通常会任意选定一个根节点使其变成有根树.有根树可以定义"父亲和儿子& ...

  7. C# Socket 编程 Sample

    使用Socket通信的服务器端编程,熟悉了服务器端和客户端的通信流程,实现了收发信息.文件传送以及震动功能 服务器端先创建Socket,然后将其和本地ip地址以及端口号连接,也就是使用Bind方法,然 ...

  8. sscanf简介

    #include<cstdio> #include<cstring> using namespace std; int main() { ]; //用法一:取指定长度的字符串 ...

  9. LG2467 地精部落

    题意 给出\(n\),求有几个\(W\)形的\(n\)的全排列(震荡) 思路 可以变求出第二个数比第一个数大的,再翻倍就好 设\(f[i][j]\)表示\(i\)个数中\(j\)个数不符合序列 转移时 ...

  10. 预处理、const、static、sizeof-说明内联函数使用的场合

    1:首先使用inline函数可以完全取代表达式形式的宏定义. 内联函数在C++类中的应用最广的应该是用来定义存取函数.我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们 ...