demo_3_8_02
动态内存分配:
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include3 #include 4 #include <string.h> 5 #include 6 #include 7 8 struct S 9 { 10 char name[20]; 11 int age; 12 }; 13 int main() 14 { 15 int n = 0; 16 scanf("%d", &n); 17 18 struct S arr[50];//存放50个struct S类型的数据 19 //30 - 浪费 20 //60 - 不够 21 22 system("pause"); 23 return 0; 24 } 25 26 int main() 27 { 28 //向内存申请10个整型的空间 29 int* p = (int*)malloc(40);//需要强制类型转换否则会error 30 //当开辟失败的时候 31 if (p == NULL) 32 { 33 //打印错误原因的方式 34 printf("%s\n", strerror(errno)); 35 //errno把错误信息返回给用户 36 } 37 else{ 38 //开辟成功,正常使用空间 39 int i = 0; 40 for (i = 0; i < 10; i++) 41 { 42 *(p + i) = i; 43 } 44 for (i = 0; i < 10; i++) 45 { 46 printf("%d\n", *(p + i)); 47 } 48 } 49 //当动态申请的空间不再使用的时候就应该还给操作系统 50 free(p);//程序结束的时候还回去 51 //p虽然还给操作系统了但p依然有能力找到那块地址 52 p = NULL;//主动把p赋值给空指针,避免犯错误再找到那个地址 53 54 system("pause"); 55 return 0; 56 } 57 58 calloc - 开辟内存空间并初始化 59 int main() 60 { 61 //malloc(10*sizeof(int)) - 不初始化 62 int* p = (int*)calloc(10, sizeof(int)); 63 if (p == NULL) 64 { 65 printf("%s\n", strerror(errno));//把错误码所对应的错误信息打印出来 66 } 67 else{ 68 int i = 0; 69 for (i = 0; i < 10; i++) 70 { 71 printf("%d ", *(p + i)); 72 } 73 } 74 //要释放空间 75 //free函数使用来释放动态开辟的空间的 76 free(p); 77 p = NULL; 78 system("pause"); 79 return 0; 80 } 81 82 //realloc - 调整动态开辟内存空间的大小 83 int main() 84 { 85 int *p = (int*)malloc(20); 86 if (p == NULL) 87 { 88 printf("%s\n", strerror(errno)); 89 } 90 else{ 91 int i = 0; 92 for (i = 0; i < 5; i++) 93 { 94 *(p + i) = i; 95 } 96 } 97 //只是在使用malloc开辟的20个字节的空间 98 //假设20个字节不能满足需求 99 //希望能有40个字节的空间 100 //这里就可使用realloc来调整动态开辟的内存空间 101 102 //realloc 函数使用注意事项: 103 //1)如果p指向的空间之后有足够的内存空间可以追加则直接追加然后返回p 104 //2)如果p指向的空间之后没有足够的内存可以追加则realloc 函数会重新找一块新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址 105 //3)得用一个新的变量来接收realloc 函数的返回值 106 int* p2 = realloc(p, 40); 107 int*ptr = realloc(p, INT_MAX); 108 //ptr不为空的时候就把p赋给ptr 109 if (ptr != NULL) 110 { 111 p = ptr; 112 } 113 int i = 0; 114 for (i = 5; i < 10; i++) 115 { 116 printf("%d ", *(p2 + i)); 117 } 118 //释放内存 119 free(p); 120 p = NULL; 121 //如果返回的是新地址,那么旧地址本身自动被释放掉了,此时free释放新的地址空间 122 123 system("pause"); 124 return 0; 125 } 126 127 int main() 128 { 129 int *p = malloc(40); 130 //万一malloc失败了,则p就被赋值空指针了 131 *p = 0;//error 132 133 int i = 0; 134 for (i = 0; i < 10; i ++ ) 135 { 136 //对空指针解引用就会出问题 137 *(p + i) = i;//error 138 } 139 free(p); 140 p = NULL; 141 system("pause"); 142 return 0; 143 } 144 145 int main() 146 { 147 //这里有5个元素的内存空间 148 int *p = (int*)malloc(5 * sizeof(int)); 149 if (p == NULL) 150 { 151 return 0; 152 } 153 else{ 154 int i = 0; 155 //而这里却有10个内存空间 156 //越界访问 - error 157 for (i = 0; i < 10; i++)//error 158 { 159 *(p + i) = i;//起始地址+下标,然后解引用 160 } 161 } 162 free(p); 163 p = NULL; 164 system("pause"); 165 return 0; 166 } 167 168 int main() 169 { 170 int a = 10; 171 int* p = &a; 172 *p = 20; 173 //对非动态开辟内存使用free函数 174 free(p); 175 p = NULL; 176 system("pause"); 177 return 0; 178 } 179 180 int main() 181 { 182 int *p = (int*)malloc(40); 183 if (p == NULL) 184 { 185 return 0; 186 } 187 //开辟成功使用这块空间 188 int *p2 = realloc(p, 80); 189 if (p2 != NULL) 190 { 191 p = p2; 192 } 193 system("pause"); 194 return 0; 195 } 196 197 //realloc 直接开辟空间 198 int main() 199 { 200 int *p = realloc(NULL, 40); 201 system("pause"); 202 return 0; 203 } 204 205 int main() 206 { 207 //使用free 释放一块动态开辟内存的一部分 208 int*p = (int*)malloc(40); 209 if (p == NULL) 210 { 211 return 0; 212 } 213 int i = 0; 214 for (i = 0; i < 10; i++) 215 { 216 *p++ = i; 217 } 218 //释放空间 219 free(p); 220 p = NULL; 221 system("pause"); 222 return 0; 223 } 224 225 int main() 226 { 227 int *p = (int*)malloc(40); 228 if (p == NULL) 229 { 230 return 0; 231 } 232 //使用 233 //对同一块动态内存多次释放 234 free(p); 235 p = NULL;//每次使用完把p赋给空指针 236 free(p);//第二个free没有什么意义了 237 system("pause"); 238 return 0; 239 } 240 241 int main() 242 { 243 while (1) 244 { 245 //动态开辟内存忘记释放(导致内存泄漏) 246 malloc(1); 247 Sleep(1000); 248 } 249 system("pause"); 250 return 0; 251 } 252 253 254 //改正一 255 void GetMemory(char **p) 256 { 257 p = (char *)malloc(100); 258 //未释放 259 } 260 void Test(void) 261 { 262 char *str = NULL; 263 GetMemory(str);//非法访问内存,导致程序崩溃 264 strcpy(str, "hello world"); 265 printf(str); 266 free(str); 267 str = NULL; 268 //出现的问题 269 //1.运行代码程序会出现崩溃的现象 270 //2.程序存在内存泄漏的问题 271 //str 以值传递的形式给p 272 //p 是GetMemory函数的形参,只能函数内部有效 273 //等GetMemory 函数返回之后,动态开辟内存尚未释放,并且无法找到,所以会造成内存泄漏 274 } 275 int main() 276 { 277 Test(); 278 char *str = "abcdef"; 279 printf("%s\n", str); 280 printf(str); 281 printf("abcdef"); 282 system("pause"); 283 return 0; 284 //最终原因是程序崩溃 285 } 286 287 288 //改正二 289 char* GetMemory(char *p) 290 { 291 p = (char *)malloc(100); 292 return p; 293 //未释放 294 } 295 void Test(void) 296 { 297 char *str = NULL; 298 str = GetMemory(str);//非法访问内存,导致程序崩溃 299 strcpy(str, "hello world"); 300 printf(str); 301 free(str); 302 str = NULL; 303 //出现的问题 304 //1.运行代码程序会出现崩溃的现象 305 //2.程序存在内存泄漏的问题 306 //str 以值传递的形式给p 307 //p 是GetMemory函数的形参,只能函数内部有效 308 //等GetMemory 函数返回之后,动态开辟内存尚未释放,并且无法找到,所以会造成内存泄漏 309 } 310 int main() 311 { 312 Test(); 313 /*char *str = "abcdef"; 314 printf("%s\n", str); 315 printf(str); 316 printf("abcdef");*/ 317 system("pause"); 318 return 0; 319 //最终原因是程序崩溃 320 }