开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
动态内存分配
例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int number;
int *a;
int i;
printf("输入数量:");
scanf("%d",&number);
//int a[number];(目前我们可以用数组轻松完成数据的输入)
a= (int*) malloc (number*sizeof(int));//malloc返回的是void类型所以需要强制类型转换
for(i=0;i<number;i++){
scanf("%d",&a[i]);//在动态分配完内存后便可以将a作为一个数组使用
}
for(i=number-1;i>=0;i--){
printf("%d",a[i]);
}
free(a);
return 0;
}
总结malloc:
需要头文件#include<stdlib.h>
void*malloc(size_t size);
向malloc申请的空间大小是以字节为单位的;
返回的类型是void,需要类型转换为自己需要的类型;(int*)malloc(n*sizeof(int));
没空间了会怎样:如果申请失败则返回0,或者叫做NULL。
free()
把申请得来的空间还给“系统”
只能还申请来的空间的首地址
常见问题
申请了没有free,会导致长时间运行内存逐渐下降;
可能是忘了,也可能是找不到合适的时机free。
free过了再free,程序会报错;
地址变过了,直接去free,程序会报错。
字符串
字符数组
char word[]={'H','e','l','l','o','!'};
| word[0] | H |
|---|---|
| word[1] | e |
| word[2] | l |
| word[3] | l |
| word[4] | o |
| word[5] | ! |
这不是C语言的字符串,因为不能用字符串的方式做计算。
字符串
char word[]={'H','e','l','l','o','!','\0'};(总共有几个单元,最后一个单元里的'0'就是0的意思)
字符串
以0(整数0)结尾的一串字符;
0或'\0'是一样的,但是和'0'不同;('0'是ASCII码中人可以读到的0)
0标志字符串的结束,但它不是字符串的一部分;
计算字符串长度的时候不包含这个0;
字符串以数组的形式存在,以数组或指针的形式访问;(更多的是以指针的形式)
string.h里有很多处理字符串的函数。
字符串变量
char *str="Hello";(有一个叫str的指针,它指向一个字符数组,字符数组中的内容是Hello)
char word[]="Hello";(有一个字符数组,里面内容就是Hello)
char line[10]="Hello";(有i一个大小为10的line数组,里面有Hello,但是占据了6个字节的位置,因为会有结尾的\0)