动态

详情 返回 返回

C_結構體學習_1 - 动态 详情

這裏記錄一下怎麼為結構體成員變量實現內存連續且為動態
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
// 今天描述結構體中的指針和數組
typedef struct _Player
{
    int level;
    char name[20];

} Player, *PPplayer;
// 上面這個第一個結構體裏面成員在內存中是連續的

void fun1()
{
    PPplayer p1 = (PPplayer)malloc(sizeof(Player)); // 為p1申請內存
    memset(p1, 0, sizeof(Player));                  // 初始化
    p1->level = 1;
    strcpy(p1->name, "張三");
    cout << "p1->level:" << p1->level << endl;
    cout << "p1->name:" << p1->name << endl;
    free(p1);
    p1 = NULL;
}

typedef struct _Player2
{
    int level;
    char *name; // name是一個指針

} Player2, *PPplayer2;
// 上面這個結構體裏面成員在內存中是不連續的
void fun2()
{
    PPplayer2 p2 = (PPplayer2)malloc(sizeof(Player2)); // 為p2申請內存
    memset(p2, 0, sizeof(Player2));                    // 初始化
    p2->level = 1;
    p2->name = (char *)malloc(strlen("1angx") + 1); // 為name申請內存,這裏用了strlen()函數,最後的\x00的大小沒有加上去,所以要加個1
    memset(p2->name, 0, 20);                        // 初始化
    strcpy(p2->name, "1angx");
    cout << "p2->level:" << p2->level << endl;
    cout << "p2->name:" << p2->name << endl;
    // free(p2->name);
    free(p2);
    p2 = NULL;
}

typedef struct _Player3
{
    int level;
    char name[1]; // 這裏給name的大小為1個字節,我們等會會在fun3函數中説明為何

} Player3, *PPplayer3;

void fun3()
{
    PPplayer3 p3 = (PPplayer3)malloc(sizeof(Player3) + strlen("1angx")); // 為p3申請內存,同時加上我們的name的大小,這裏因為我們數組的大小是1所以不需要再加上1了
    memset(p3, 0, sizeof(Player3) + strlen("1angx"));                    // 初始化
    p3->level = 1;
    strcpy(p3->name, "1angx"); // 這裏我們直接給name賦值是不是越界訪問了,確實是,但是由於在結構體中內存是連續的,name在結構體中,我們的結構體的大小足夠大,且level name的內存是連續的
    cout << "p3->level:" << p3->level << endl;
    cout << "p3->name:" << p3->name << endl;
    free(p3);
    p3 = NULL;
    puts("fun3中,我們就實現了內存連續,且大小為動態的name");
    puts("我們通過‘越界訪問’實現了這一要求");
}

int main()
{
    fun1(); // fun1中確實是利用數組實現了角色名稱的創建,但是大小是固定的,不能動態改變
    putchar('\n');

    fun2(); // fun2中利用指針實現了角色名稱的創建,大小是動態的,但是內存是不連續的
    putchar('\n');
    puts("那我們怎麼實現大小是動態的,其在內存空間中的大小也是動態的?\n");
    puts("答案:fun3\n");

    fun3();

    return 0;
}

如有問題,歡迎糾錯與討論

Add a new 评论

Some HTML is okay.