面试题答案
一键面试-
指针的定义:
- 在C语言中,指针是一种变量,它存储的是另一个变量的内存地址。例如,
int *ptr;
这里定义了一个名为ptr
的指针变量,它可以指向int
类型的变量。*
符号在这里用于声明ptr
是一个指针。
- 在C语言中,指针是一种变量,它存储的是另一个变量的内存地址。例如,
-
通过指针动态分配内存:
- 使用
malloc
函数来动态分配内存。malloc
函数在堆上分配指定字节数的内存,并返回一个指向分配内存起始地址的指针。如果分配失败,返回NULL
。例如:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr; ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { printf("内存分配失败\n"); return 1; } *ptr = 10; return 0; }
- 在上述代码中,
malloc(sizeof(int))
分配了足够存储一个int
类型数据的内存空间,并将返回的指针强制转换为int *
类型,赋值给ptr
。然后通过*ptr
对分配的内存进行赋值。
- 使用
-
释放内存:
- 使用
free
函数来释放通过malloc
分配的内存。例如:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr; ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { printf("内存分配失败\n"); return 1; } *ptr = 10; free(ptr); ptr = NULL; return 0; }
- 调用
free(ptr)
释放ptr
所指向的内存空间,之后将ptr
赋值为NULL
,防止出现野指针。
- 使用
-
内存释放不当导致的问题:
- 内存泄漏:如果忘记调用
free
函数释放动态分配的内存,这块内存将一直被占用,直到程序结束。随着程序中不断地动态分配内存而不释放,可用内存会越来越少,最终可能导致系统内存耗尽,程序崩溃。例如:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr; for (int i = 0; i < 1000000; i++) { ptr = (int *)malloc(sizeof(int)); // 这里没有调用 free(ptr) } return 0; }
- 野指针:如果在调用
free
之后没有将指针赋值为NULL
,该指针就成为野指针。野指针指向的内存已经被释放,再次使用这个指针可能导致未定义行为,例如程序崩溃或数据损坏。例如:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr; ptr = (int *)malloc(sizeof(int)); *ptr = 10; free(ptr); // 这里没有将 ptr 赋值为 NULL printf("%d\n", *ptr); // 未定义行为 return 0; }
- 多次释放:对同一块已经释放的内存再次调用
free
函数,也会导致未定义行为。例如:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr; ptr = (int *)malloc(sizeof(int)); free(ptr); free(ptr); // 多次释放,未定义行为 return 0; }
- 内存泄漏:如果忘记调用