1.
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *i = NULL;
free(i);
return 0;
}
执行结果如下:
可见,没有任何报错,执行完成。
2.
执行结果如下:
3.
valgrind安装使用参考:valgrind安装使用教程
运行结果如下:
4.
程序代码如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *i = malloc(sizeof(int));
*i = 1;
return 0;
}
直接运行结果如下;
gdb运行结果如下:
valgrind运行结果如下:
可以看到显示有4个字节的内存泄露。
5.
程序代码如下:
#include <stdlib.h>
int main() {
int* arr = malloc(100 * sizeof(int));
arr[100] = 0;
return 0;
}
直接运行结果如下:
并没有报错
再valgrind中运行结果如下:
可发现报错:invalid write
6.
程序代码如下:
#include <stdlib.h>
#include <stdio.h>
int main() {
int* arr = malloc(100 * sizeof(int));
arr[1] = 10;
free(arr);
printf("the second element is %d\n", arr[1]);
return 0;
}
直接运行结果如下:
程序依然运行,但是元素值却变了。
使用valgrind工具运行结果如下所示:
存在invalid read问题
7.
程序代码如下:
#include <stdlib.h>
#include <stdio.h>
int main() {
int* arr = malloc(100 * sizeof(int));
printf("%p, %p\n", arr, arr + 10);
free(arr + 10);
return 0;
}
直接运行结果如下:
这种错误就不用工具栏,直接运行就能发现。\
8.
程序代码如下;
#include <stdlib.h>
#include <stdio.h>
typedef struct Arr {
int size;
int capacity;
int* arr;
}* Vector;
Vector vec_create(int n) {
Vector v = malloc(sizeof(struct Arr));
v->size = 0;
v->capacity = n;
v->arr = (int*)malloc(sizeof(int) * n);
return v;
}
void vec_pushback(Vector v, int num) {
if (v->size == v->capacity) {
// printf("realloc\n");
v->capacity *= 2;
v->arr = (int*)realloc(v->arr, v->capacity * sizeof(int));
}
// printf("push_back size = %d, capacity = %d, num = %d\n", v->size, v->capacity, num);
v->arr[v->size] = num;
v->size++;
}
void vec_destroy(Vector v) {
free(v->arr);
free(v);
}
void vec_print(Vector v) {
int i;
for (i = 0; i < v->size; ++i) {
printf("the element %d is %d\n", i, v->arr[i]);
}
}
int main() {
Vector v = vec_create(1);
vec_pushback(v, 1);
vec_pushback(v, 2);
vec_pushback(v, 3);
vec_print(v);
vec_destroy(v);
return 0;
}
运行结果如下:
向量与链表相比:
vecor访问某个元素的时间复杂度是O(1),而list访问某个元素的时间复杂度是O(N);
插入和删除方面:vector的时间复杂度是O(N),而list的因为不需要搬移元素时间复杂度为O(1)。
9.
gdb学习(持续更新):gdb调试常用指令
valgrind学习(持续更新):valgrind安装使用教程