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


    【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
    ", sizeof(test));
    
        TEST2 test2;
        test2.name = (char*)malloc(20);
        printf("size of struct = %d
    ", sizeof(test2));
    
    
        printf("%s
    ", test.name[1]);
        changeName(&test);
        printf("%s
    ", 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

  • 相关阅读:
    ASP.NET 弹出对话框和页面之间传递值的经验总结
    开拔(博)
    Qt 报错:use of undeclared identifier
    Qt http学习
    Qt 使用QJson生成解析json数据的方法
    Qt Http请求,post和get
    Qt 使用QNetworkAccessManager实现Http操作
    一个截断多个数据库日志的的存储过程
    如何在程序中友好提示错误
    招聘网络工程师一名
  • 原文地址:https://www.cnblogs.com/huty/p/8517768.html
Copyright © 2020-2023  润新知