常见的错误参考
经典的scanf bug
scanf 需要传入的的变量对应的地址
#include<stdio.h>
int main(void){
int i;
double j;
scanf("%d,%ld",i,j);
scanf("%d,%ld",&i,&j);
}
指针未正确初始化
当不知道指针正确的初始值时最好赋值为NULL
错误示例:
int sum(int a[],int n){
int *p;
int sum=0;
for(int i=0;i<n;i++){
sum+=*p++;
}
}
正确写法:*p 指向 int a[]
int sum(int a[],int n){
int *p;
p=a;
int sum=0;
for(int i=0;i<n;i++){
sum+=*p++;
}
}
经典错误示例:
#include<stdio.h>
#include<stdlib.h>
void GetMemory(char *p,int num){
p=(char*)malloc(sizeof(char)*num);
}
int main(void){
char *str=NULL;
printf("%d\n",str);
GetMemory(str,100);
printf("%d\n",str);
}
运行结果
0
0
正确解法一:使用指针的指针
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char **p,int num){
*p=(char*)malloc(sizeof(char)*num);
}
int main(void){
char *str=NULL;
printf("%d\n",str);
GetMemory(&str,100);
printf("%d\n",str);
strcpy(str,"hello world!");
puts(str);
free(str);
}
运行结果
0
6833792
hello world!
正确解法二:使用retrun返回值
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(int num){
char *p=(char*)malloc(sizeof(char)*num);
return p;
}
int main(void){
char *str=NULL;
printf("%d\n",str);
str=GetMemory(100);
printf("%d\n",str);
strcpy(str,"hello world!");
puts(str);
free(str);
}
运行结果:
0
7161472
hello world!
指针被释放时没有置空
野指针:指针指向的内容已经无效了,而指针并没有被置空 错误示例:
void relese_foo(int *p){
free(p);
p=NULL;
}
int *pointer=(int *)malloc(sizeof(int));
int bar(){
relese_foo(pointer);
return 0;
}
正确写法:
void relese_foo(int *p){
free(p);
}
int *pointer=(int *)malloc(sizeof(int));
int bar(){
relese_foo(pointer);
pointer=NULL;
return 0;
}
不要用return语句返回指向“栈内存”的指针
栈内的变量会随着函数的返回而销毁 倘若返回栈内存的指针,这个指针也是个野指针
错误示例:
#include<stdio.h>
#include<string.h>
char *getString(void){
char p[]="hello world";
return p;
}
int main(void){
char *str=NULL;
str=getString();
puts(str);
}
运行结果:编译器会报警告
ptr.c: In function 'getString':
ptr.c:6:5: warning: function returns address of local variable [enabled by default]
��a
内存覆盖
常见一
#define array_size 100
int *a=(int *)malloc(sizeof(int)*array_size);
for(int i=0;i<=array_size;i++){
a[i]=NULL;
}
正确写法:将i<=array_size 改为i<array_size
常见二
#define array_size 100
int *a=(int *)malloc(array_size);
for(int i=0;i<array_size;i++){
a[i]=NULL;
}
正确写法:int *a=(int *)malloc(sizeof(int)*array_size);
常见三
char s[8];
int i;
gets(s);
没有检查最大字符的大小
常见四
char* heapify_string(char* s){
int len=strlen(s);
char *new_s=(char *)malloc(len);
strcpy(new_s,s);
return new_s;
}
字符串必须以0x00结束 正确写法:char *new_s=(char *)malloc(len+1);
常见五
void dec_positive(int *a){
*a--;
if(*a<0) *a=0;
}
正确写法:(*a)--; 这种写法会将a指向的变量的值减一
二次释放
错误示例:
void my_write(int *x){
...use x...
free(x);
}
int *x=(int *)malloc(sizeof(int)*N);
my_read(x);
my_write(x);
free(x);
引用已经释放的内存
x=malloc(N*sizeof(int));
free(x);
...
y=malloc(M*sizeof(int));
for(int i;i<M;i++){
y[i]=x[i]++;
}
内存泄漏
malloc、calloc、realloc获取的内存,在使用完后,未释放。会造成内存泄漏。
|