1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| #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)); 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;
} Player2, *PPplayer2;
void fun2() { PPplayer2 p2 = (PPplayer2)malloc(sizeof(Player2)); memset(p2, 0, sizeof(Player2)); p2->level = 1; p2->name = (char *)malloc(strlen("1angx") + 1); memset(p2->name, 0, 20); strcpy(p2->name, "1angx"); cout << "p2->level:" << p2->level << endl; cout << "p2->name:" << p2->name << endl; free(p2); p2 = NULL; }
typedef struct _Player3 { int level; char name[1];
} Player3, *PPplayer3;
void fun3() { PPplayer3 p3 = (PPplayer3)malloc(sizeof(Player3) + strlen("1angx")); memset(p3, 0, sizeof(Player3) + strlen("1angx")); p3->level = 1; strcpy(p3->name, "1angx"); cout << "p3->level:" << p3->level << endl; cout << "p3->name:" << p3->name << endl; free(p3); p3 = NULL; puts("fun3中,我们就实现了内存连续,且大小为动态的name"); puts("我们通过‘越界访问’实现了这一要求"); }
int main() { fun1(); putchar('\n');
fun2(); putchar('\n'); puts("那我们怎么实现大小是动态的,其在内存空间中的大小也是动态的?\n"); puts("答案:fun3\n");
fun3();
return 0; }
|