1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include
3 #include
4 #include <string.h>
5
6 char *getmemory(void)
7 {
8 char p[] = "hello world";
9 return p;
10 }
11 void test(void)
12 {
13 char *str = NULL;
14 str = getmemory();
15 printf(str);
16 }
17 int main()
18 {
19 test();
20 system("pause");
21 return 0;
22 //非法访问内存
23 }
24
25 int* test()
26 {
27 static int a = 10;//静态区 static修饰局部变量时生命周期变长了
28 int a = 10;//栈区
29 return &a;
30 }
31 int main()
32 {
33 int*p = test();
34 *p = 20;//error 非法访问内存
35 system("pause");
36 return 0;
37 }
38
39 int* test()
40 {
41 int *ptr = malloc(100);//堆区 只有free后才回收/释放
42 return ptr;
43 }
44 int main()
45 {
46 int *p = test();
47 system("pause");
48 return 0;
49 }
50
51 //运行test会出现什么结果?
52 void getmemory(char **p, int num)
53 {
54 *p = (char *)malloc(num);
55 }
56 void test(void)
57 {
58 char *str = null;
59 getmemory(&str, 100);
60 strcpy(str, "hello");
61 printf(str);
62 free(str);//动态释放内存空间
63 str = null;
64 //忘记释放动态开辟的内存,导致内存泄漏
65 }
66 int main()
67 {
68 test();
69 return 0;
70 //输出hello 存在内存泄漏
71 }
72
73 void test(void)
74 {
75 char *str = (char *)malloc(100);
76 strcpy(str, "hello");
77 free(str);//free释放str指向的空间后,并不会把str置为null
78 str = null;//把str置为空指针
79 //对下面的指针判断才有意义
80 if (str != null)
81 {
82 strcpy(str, "world");
83 printf(str);
84 }
85 }
86 int main()
87 {
88 test();
89 system("pause");
90 return 0;
91 //输出world 非法访问 程序崩溃
92 }
93
94 struct s
95 {
96 int n;
97 int arr[10];//未知大小 - 柔性数组成员
98 //结构的最后一个元素
99 };
100 int main()
101 {
102 //struct s s;
103 //printf("%d\n", sizeof(s));
104 struct s* ps = (struct s*)malloc(sizeof(struct s) + 5 * sizeof(int));
105 ps->n = 100;
106 int i;
107 for (i = 0; i < 5; i++)
108 {
109 ps->arr[i] = i;//0 1 2 3 4
110 }
111 struct s* ptr = realloc(ps, 44);
112 if (ptr != null)
113 {
114 //开辟成功后就使用它
115 ps = ptr;
116 }
117 for (i = 5; i < 10; i++)
118 {
119 ps->arr[i] = i;
120 }
121 for (i = 0; i < 10; i++)
122 {
123 printf("%d", ps->arr[i]);
124 }
125 //释放空间
126 free(ps);
127 ps = null;
128
129 system("pause");
130 return 0;
131 }
132
133 struct s
134 {
135 int n;
136 int *arr;
137 };
138 int main()
139 {
140 struct s*ps = (struct s*)malloc(sizeof(struct s));//创建结构体大小
141 ps->arr = malloc(5 * sizeof(int));
142 int i = 0;
143 for (i = 0; i < 5; i++)
144 {
145 ps->arr[i] = i;
146 }
147 for (i = 0; i < 5; i++)
148 {
149 printf("%d ", ps->arr[i]);
150 }
151 //调整大小
152 int *ptr = realloc(ps->arr, 10 * sizeof(int));
153 if (ptr != null)
154 {
155 ps->arr = ptr;
156 }
157 for (i = 5; i < 10; i++)
158 {
159 ps->arr[i] = i;
160 }
161 for (i = 0; i < 10; i++)
162 {
163 printf("%d ", ps->arr[i]);
164 }
165 free(ps->arr);
166 ps->arr = null;
167 free(ps);
168 ps = null;
169 system("pause");
170 return 0;
171 }
172
173 文件操作
174
175 int main()
176 {
177 int a = 10000;
178 file* pf = fopen("test.txt", "wb");
179 fwrite(&a, 4, 1, pf);//以二进制文件写
180 fclose(pf);
181 pf = null;
182 system("pause");
183 return 0;
184 }
185
186 int main()
187 {
188 //打开文件test.txt
189 //相对路径
190 fopen("test.txt", "r");
191 //绝对路径
192 fopen("e:\\c语言\\专升本c语言\\专练\\test_3_9\\test_3_9", "r");
193 // .. 表示上一级路径
194 // . 表示当前路径
195 system("pause");
196 return 0;
197 }
198
199 int main()
200 {
201 file* pf = fopen("test.txt", "r");
202 //打开文件失败会返回一个空指针
203 if (pf == null)
204 {
205 printf("%s\n",strerror(errno));
206 }
207 //打开成功
208 //读文件
209 //关闭文件,把资源释放掉
210 fclose(pf);
211 pf = null;//赋值给空指针
212 system("pause");
213 return 0;
214 }
215
216 int main()
217 {
218 FILE *pfWrite = fopen("test2.txt", "w");
219 if (pfWrite == NULL)
220 {
221 printf("%s\n", strerror(errno));
222 return 0;
223 }
224 //写文件
225 fputc('b', pfWrite);
226 fputc('i', pfWrite);
227 fputc('t', pfWrite);
228 //关闭文件
229 fclose(pfWrite);
230 pfWrite = NULL;
231 }
232
233 int main()
234 {
235 FILE *pfRead = fopen("test2.txt", "r");
236 if (pfRead == NULL)
237 {
238 printf("%s\n", strerror(errno));
239 return 0;
240 }
241 //读文件
242 printf("%c ", fgetc(pfRead));
243 printf("%c ", fgetc(pfRead));
244 printf("%c ", fgetc(pfRead));
245 //关闭文件
246 fclose(pfRead);
247 pfRead = NULL;
248 }
249
250 //从键盘输入 - 输出到屏幕 - 键盘&屏幕都是外部设备
251 //键盘 - 标准输入设备 - stdin
252 //屏幕 - 标准输出设备 - stdout
253 //是一个程序默认打开的两个流设备
254 //stdin FILE*
255 //stdout FILE*
256 //stderr FILE*
257
258 int main()
259 {
260 int ch=fgetc(stdin);//从标准输入流中写
261 fputc(ch, stdout);//从标准输出流中读
262 system("pause");
263 return 0;
264 }
265
266 int main()
267 {
268 FILE* pf = fopen("test.txt", "r");
269 if (pf == NULL)
270 {
271 printf("%s\n", strerror(errno));
272 return 0;
273 }
274 //读文件
275 int ch = fgetc(pf);
276 printf("%c", ch);
277 ch = fgetc(pf);
278 printf("%c", ch);
279 ch = fgetc(pf);
280 printf("%c", ch);
281 //关闭文件
282 fclose(pf);
283 pf = NULL;
284 system("pause");
285 return 0;
286 }
287
288 int main()
289 {
290 char buf[1024] = { 0 };
291 //打开一个文件,模式为只读
292 FILE* pf = fopen("test.txt", "r");
293 //如果为空则返回0
294 if (pf == NULL)
295 {
296 return 0;
297 }
298 //读文件
299 fgets(buf,1024,pf);
300 printf("%s\n", buf);
301
302 //关闭文件
303 fclose(pf);
304 //置空
305 pf = NULL;
306 system("pause");
307 return 0;
308 }
309
310 int main()
311 {
312 char buf[1024] = { 0 };
313 //打开一个文件,模式为只读
314 FILE* pf = fopen("test.txt", "r");
315 //如果为空则返回0
316 if (pf == NULL)
317 {
318 return 0;
319 }
320 //读文件
321 fgets(buf, 1024, pf);
322 //puts会换行
323 puts(buf);
324
325 //关闭文件
326 fclose(pf);
327 //置空
328 pf = NULL;
329 system("pause");
330 return 0;
331 }
332
333 //写一行数据 - 操作的是一行数据
334 int main()
335 {
336 char buf[1024] = { 0 };
337 //打开一个文件,模式为只读
338 FILE* pf = fopen("test.txt", "r");
339 //如果为空则返回0
340 if (pf == NULL)
341 {
342 return 0;
343 }
344 //写文件
345 fputs("hello\n", pf);
346 fputs("world\n", pf);
347 //关闭文件
348 fclose(pf);
349 //置空
350 pf = NULL;
351 system("pause");
352 return 0;
353 }
354
355 int main()
356 {
357 //从键盘读一行文本信息
358 char buf[1024] = { 0 };
359 fgets(buf,1024,stdin);//从标准输入流
360 fputs(buf, stdout);//从标准输出流
361
362 //等价于
363 gets(buf);
364 puts(buf);
365 system("pause");
366 return 0;
367 }
368
369 //格式化输入输出函数 - fscanf - fprintf
370 struct S
371 {
372 int n;
373 float score;
374 char arr[10];
375 };
376 int main()
377 {
378 struct S s = { 100, 3.14f, "ding" };
379 FILE* pf = fopen("test.txt", "w");
380 //判断
381 if (pf == NULL)
382 {
383 return 0;
384 }
385 //以格式化的形式写文件
386
387 //关闭文件
388 fclose(pf);
389 //置空
390 pf = NULL;
391 system("pause");
392 return 0;
393 }