1. 间接引用坏指针
- int main()
- {
- int val;
- scanf("%d", val); // Error!
- scanf("%d", &val); // Ok!
- return 0;
- }
2. 读未初始化的内存
- int main()
- {
- int n = 10;
- int* y = (int*) malloc(n * sizeof(int));
- for (int i = 0; i < n; i++)
- {
- y[i] += i; // Error! y[i] != 0. Let y[i] = 0 or use calloc().
- }
- return 0;
- }
3. 允许栈缓冲区溢出
- int main()
- {
- char buf[64];
- gets(buf); // Error! Use fgets().
- return 0;
- }
4. 假设指针和它们指向的对象是相同大小的
- int main()
- {
- int n = 10;
- int m = 5;
- // Error! Should be sizeof(int*), sizeof(int*) could be 4 bytes or 8 bytes.
- int** A = (int**) malloc(n * sizeof(int));
- for (int i = 0; i < n; i++)
- {
- A[i] = (int*) malloc(m * sizeof(int));
- }
- return 0;
- }
5. 造成错位错误, 数组越界
- int main()
- {
- int a[10];
- for (int i = 0; i <= 10; i++) // Error! Should be i < 10.
- {
- a[i] = i;
- }
- return 0;
- }
6. 引用指针, 而不是它所指向的对象
- int main()
- {
- int a[1] = 10;
- int* p = a[0];
- *p--; // Error! Should be (*p)--.
- cout << *p << endl;
- return 0;
- }
7. 误解指针运算
- int* search(int *p, int val)
- {
- while (*p && *p != val)
- p += sizeof(int); // Error! Should be p++.
- return p;
- }
8. 引用不存在 (临时) 的变量
- int *stackref()
- {
- int val;
- return &val; // Error! Returned a pointer to local variable.
- }
9. 引用空闲堆块中的数据
- int main()
- {
- int* x = (int*) malloc(100);
- free(x);
- x[0]; // Error! x[0] is in a free block.
- return 0;
- }
10. 引起内存泄漏
- void leak(int n)
- {
- int* x = (int*) malloc(n * sizeof(int));
- return; // Error! Should use free();
- }
来源: http://www.bubuko.com/infodetail-2659756.html