C语⾔学习(动态内存分配和字符串)
动态内存分配:
malloc函数:
要加头⽂件#inclde<stdlib.h>
格式:void*malloc(size_t size);
向malloc申请的空间的⼤⼩是以字节为单位的
返回的结果是void,需要类型转型转换 如a=(int*)malloc(变量or数字*数字);
#include<stdio.h>
#include<stdlib.h>
int main()
{
int b=7;
int *a;
int i;
//可以将a当作数组使⽤
a=(int*)malloc(b*sizeof(int));
//输⼊
for(i=0;i<7;i++){
scanf("%d",&a[i]);
}
//输出
for(i=0;i<7;i++){
printf("%d\n",a[i]);
}
//释放内存空间
free(a);
for(i=0;i<7;i++){
printf("%d\n",a[i]);
}
return 0;
}
当没有空间时,则申请失败返回0或者NULL。
free函数:
格式:free(变量): 原型: void free (void* 变量); 注意该变量不能释放int *p来的指针
free() 可以释放由malloc()、calloc()、realloc()分配的内存空间,以便其他程序再次使⽤。
c语言如何创建字符串数组申请过的空间,最终都应该要还;若不还,会产⽣内存垃圾,内存漏洞
只能还申请来的空间的⾸地址 例如:p向malloc申请了空间,再p++,free(p)只释放了p,⽆法释放p++
字符串:
char 变量,该变量可以存⼊字符char a=‘a’;
字符串常量在内存中存放位置由系统⾃动安排,系统在存储⼀个字符串常量时先给定⼀个起始位置,所以字符串常量实质上是⼀个指向该字符串⾸字符的指针常量。
所以输出字符串时,输出参数给出起始位置(地址)(s[0],s[1],s,s+1),'\0'⽤来控制结束
以0或者'\0'(整数0)结尾的⼀串字符,注意和'0'不⼀样,0标志字符串的结束,不是字符串的⼀部分,计算字符串的长度不包含0字符串以数组的形式存在,更多的是以指针的形式,以数组或指针的形式访问
通过数组的⽅式可以遍历字符串
不能⽤运算符对字符串做运算
字符串变量:
char *str="Hello";
char word[]="Hello";
char line[10]="Hello"; 占⽤六个字节,系统⾃动⽣成⼀个结尾0,算上⼀个字节字符串常量:
char *s="Hello World"; const char *s="Hello World";
s是⼀个指针,初始化为指向以恶搞字符串常量
因为实际上是const类型,这个常量所在的地⽅为代码段,只读,不能写⼊
同⼀内容的两个字符串常量的地址相同
如果需要修改字符串,应该⽤数组:char s[ ]="Hello World";
#include<stdio.h>
int main(void)
{
int i=0;
const char *s="Hello World";
const char *s2="Hello World";
char *s3="Hello";
printf("%p",&i);
//&i=000000000065FE04
//s=0000000000429000
//s2=0000000000429000//代码段,只读
/
/s3=000000000042900C
}
数组:这个字符串在这⾥,可读写
作为本地变量空间⾃动被回收
指针:这个字符串不知道在哪⾥,只读
处理参数
动态分配空间 malloc
字符串赋值:
char *t="title";
char *s;
s=t;
并没有产⽣新的字符串,只是让指针s指向了t所指的字符串,对s的操作就是对t做的
字符串输⼊输出:
char string[8];
scanf("%s",string);
printf("%s",string);
scanf读⼊⼀个单词(到空格、tab或回车为⽌) PS:gets函数可以读空格,但不安全
scanf是不安全的,因为不知道要读⼊的内容的长度
不安全的输⼊,解决⽅案:
在%和s之间的数字表⽰最多允许读⼊的字符数量,这个数字要⽐数组的⼤⼩⼩⼀(\0占了最后⼀个数组), %s改为%7s,表明最多输⼊7个字符
若输⼊超出所允许读⼊的字符数量,则超出的字符算⼊下⼀个scanf⾥⾯
常见错误:
char *i;
scanf("%s",i);
以为char*就是字符串类型,就可以直接使⽤
定义字符串指针后,如果没有对它赋值,指针的值是不确定的,不能明确它指向的内存单元。没有对指针i赋值,却对i指向的单位赋值。如果该单位已分配给其他变量,其值就改变了。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char *ch;
ch = (char *)malloc(sizeof(char)*100);
scanf("%s",ch);
puts(ch);
return 0;
}
空字符串:
char buffer[100]=" "; 这个数组的长度有100,⾥⾯的内容是空的
char buffer[ ]=" "; 这个数组的长度只有1
⼆维字符数组:
char a[ ] [ ];
char *a[ ];
程序参数:
int main(int argc,char const *argv[ ])
argc是命令⾏总的参数个数
argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数是命令⾏后⾯跟的⽤户输⼊的参数
argc和argv是你通过命令⾏窗⼝传给程序的。
在程序启动的时候(),就携带参数给他,⽽不是运⾏过程中敲⼊东西给程序。这时候需要⽤⽤到带参数(int argc, char *argv[])的main函数。
putchar:
int putchar(int c);
向标准输出写⼀个字符
返回写⼏个字符,EOF(-1)表⽰写⼊失败
getchar:
int getchar(void);
从标准输⼊读⼊⼀个字符
返回类型是int是为了返回EOF(-1)
区分scanf,scanf将⼀串字符或数字作为⼀个整体,⽽getchar是⼀个个字符或数字地读⼊
#include<stdio.h>
int main(int argc,char const *argv[])
{
int ch;
while((ch=getchar())!=EOF){
putchar(ch);
}
printf("EOF\n");
return 0;
}
//写⼊任何字符或数字都会原封不动地输出
//在windouws下,CTRL+Z便会输出EOF
EOF的作⽤:
当终端有字符输⼊时,Ctrl+Z产⽣的EOF相当于结束本⾏的输⼊,将引起getchar()新⼀轮的输⼊;
当终端没有字符输⼊或者可以说当getchar()读取新的⼀次输⼊时,输⼊Ctrl+Z,此时产⽣的EOF相当于⽂件结束符,程序将结束getchar()的执⾏。
string.h:
strlen
size_t strlen(const char *s); strlen(数组名);
size_t表⽰对象类型,const保证不改变变量
意义:返回s的字符串长度(不包括结尾的\0)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论