strtok 字符串分割函数
#include<stdio.h>
 int main(){
     char str[] = "this,a sample string.";
     char* sep = ",";
     char* pch = strtok(str, sep);
     printf("%s\n", pch);
     while (pch != NULL){
         printf("%s\n", pch);
         pch = strtok(NULL, sep);
     }
     system("pause");
     return 0;
 }
动态内存分配
为什么存在动态内存分配
动态内存函数介绍
malloc
free
calloc
realloc
常见的动态内存错误
柔性数组
为什么动态内存分配?
int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟十个字节的连续空间
但是上述开辟空间的方式有两个特点:
1.空间开辟的大小是固定的
2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配
但是对于空间的需求,不仅是上述情况,有时候需要空间大小在程序运行的时候只能试试动态内存开辟了.
#include<stdio.h>
int g = 0;
void fun(int x, int y){
     int m; //局部变量
     int n;
 }
int main(){
     //静态开辟 栈区
     int a = 10;
     char* str = "hello";
     int arr[10] = { 0 };
    system("pause");
     return 0;
 }
stack栈区:(局部变量,函数的参数)
heap堆区:自由存储区 malloc free
static静态常量区:(静态定义的对象,字符串常量)
malloc 和 free
#define  _CRT_SECURE_NO_WARNINGS
 #include<stdio.h>
 void main(){
     int n;
     printf("input n:");
     scanf("%d",&n);
     //动态内存开辟
     int* arr = (int *)malloc(sizeof(int) * n);//n int
     if (NULL == arr){
         printf("neicunyichu");
         return ;
     }
     for (int i = 0; i < n; i++){
         arr[i] = i + 1;
     }
     for (int i = 0; i < n; i++){
         printf("%d", arr[i]);
     }
     printf("\n");
    free(arr);//释放哦
     system("pause");
     
 }
void main(){
     int *p = (int*)malloc(100);
     free(p);//释放空间
    system("pause");
     
 }
释放p之后这片内存已经释放了,但指针*p依旧指向这块内存,它已经变成了野指针.
所以要对它赋值 NULL
p = NULL;//释放指针
calloc和malloc很像,一般用malloc代劳
void main(){
     int *p = (int*)malloc(sizeof(int) * 10);
     if (NULL == p)
         return 0;
    int *p1 = (int*)calloc(10,sizeof(int));//会把申请的空间初始化
     if (NULL == p1)
         return 0;
realloc 对申请空间的大小进行调整
#define  _CRT_SECURE_NO_WARNINGS
 #include<stdio.h>
 void main(){
     int n = 5;
     int* p = (int*)malloc(sizeof(int)* n);
     if (NULL == p){
         printf("yichule");
         return ;
     }
     for (int i = 0; i < n; i++){
         p[i] = i + 1; //1 2 3 4 5
     }
     for (int i = 0; i < n; i++){
         printf("%d",p[i]);
     }
     printf("\n");
    //1 2 3 4 5 6 7 8 9 10
     n = 10;
     p = realloc(p, sizeof(int)* n);
if(NULL = p){
printf("yichule");
return;
}
     for (int i = 5; i < n; i++){
         p[i] = i + 1; //1 2 3 4 5 x x x x x
     }
     for (int i = 0; i < n; i++){
         printf("%d",p[i]); //1 2 3 4 5
     }
     printf("\n");
     system("pause");
     
 }
.bss段 一般来存放未初始化的全局变量;
被初始化的在.data段即数据段(在静态常量区).
柔性数组:
#define  _CRT_SECURE_NO_WARNINGS
 #include<stdio.h>
typedef struct test
 {
     char a;
     double b;
     int c;
     char arr[0];//柔性数组成员 不占空间
 }test;
void main(){
     printf("size = %d\n",sizeof(test));
     system("pause");
     
 }
