C语言-犯得错误


犯的错误

for循环

括号里是分号

1
for(int i; i<100; i++)

一次定义多个变量

变量间用逗号

1
int a, b, c;

scanf赋值

赋值得用&

1
2
int a;
scanf("%d", &a)

#define MONTHS 12

标识符常量必须大写

gets(arr1) !=NULL

gets()试图超过文件结尾读取字符,这个表达式的值为NULL

使用scanf对字符数组赋值时,不用&

1
2
char arr[10];
scanf("%s", arr)

指针和结构体变量

0SBlJU.png

main函数参数

当有参数是,第一个参数是整数,第二个是字符串数组指针

函数

函数返回值

1
2
3
4
5
// 函数不能直接返回一个数组,但可以返回一个数组指针
int *fun(){
int arr[]={1,2,3};
return arr;
}

数组

赋值(scanf)

1
2
3
// scanf("%s",arr)
int arr[10];
scanf("%s",arr) //不用加地址符&,因为数组名就表示第一个元素

计算长度

1
2
int len=sizeof(arr)/sizeof(arr[0]) //一维
int len=sizeof(arr[0])/sizeof(arr[0][0]) //二维

解决函数不能返回数组的问题

malloc

1
通过堆区动态开辟内存解决:C语言中,我们通常用malloc来在堆区动态开辟内存,利用堆区“现用现开辟,用完手动收回”特点,实现灵活管理
1
2
3
4
5
6
7
8
9
10
11
// 法一 使用malloc动态开辟堆区,但不要忘记使用free,避免内存泄漏
char *fun(){
char *str=(char *)malloc(100);
strcpy(str,"hello world")
return str;
}
int main(){
char *p=fun();
printf("%s",p);
free(p);
}

指针

1
由调用方传入数组指针:此种方法不需要函数返回地址,而是在调用时直接 传入数组地址,委托被调用方进行操作,由于此局部变量属于调用方本身,故即便被调用方结束内存释放,也不会被影响到该数组。
1
2
3
4
5
6
7
8
9
10
11
char *fun(char *p){
strcpy(p,"hello world");
return p;
}

int main(){
char str[100]="\0";
fun(str);
printf("%s",str);
return 0;
}

参考

全局变量

1
这种方法最方便,但此方法打破了函数间的通信及封装的思想

常量区

堆与栈

1
1.malloc动态请求的区域属于堆区,需要手动free
1
2
3
4
5
6
7
8
9
2.数组属于栈区,系统自动回收
int *fun(){
int arr[]={1,2,3};
return arr; //数组名已经表示地址了
}
int main(){
int *P=fun();
printf("%s",p);//因为函数里的数组属于局部变量,随着函数结束,数组也被自动回收了;所以这里得到的值不是正确的
}
1
2
3
4
5
6
7
8
9
char *fun(){
char *str="hello world"
return str;
}

int main(){
char *p=fun();
printf("%s",p); //可以正确输出hello world,因为函数里的str属于常量区,不会随着函数结束被系统收回
}

本文标题:C语言-犯得错误

文章作者:TTYONG

发布时间:2020年08月25日 - 21:08

最后更新:2022年10月10日 - 17:10

原始链接:http://tianyong.fun/C%E8%AF%AD%E8%A8%80-%E7%8A%AF%E7%9A%84%E9%94%99%E8%AF%AF.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%