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安装使用教程