【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\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
轉載于:https://www.cnblogs.com/huty/p/8517768.html
總結
以上是生活随笔為你收集整理的【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宿主机( win 7 系统) ping
- 下一篇: 移动端HTML5性能优化