C语言程序设计(23)

85 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)