C语言学习记录

1.include <> ""区别

#include <> 是系统的库

#include “” 是自己的库

2.悬空指针和野指针

(1)悬空指针:

在内存中创建堆空间malloc

释放堆空间free

此时改指针为悬空指针,因为指向了一个空地址。

所以需要将指针指向为NULL

(2)野指针:

定义一个变量,但是没给他赋值,这个指针也就没有地址,不知道指向于谁,所以就成了野指针。

3.静态开辟和动态开辟内存区别

静态开辟的内存大小是不能修改的,栈区

动态开辟空间是可以修改的,堆区

4.栈和堆区别

栈区的内存空间比较小,堆区的内存空间比较大,具体大小每个平台都不一样

栈区的内存自动回收,堆区需要手动创建和回收

5.malloc,realloc使用和区别

//在部分编译器上需要手动转型(int *),在clion上不需要
//在堆区开辟空间
int * arr = (int *)malloc(sizeof(int) * num);
//在堆区扩大空间 第一个参数:前面开辟的指针 ,第二个参数:总大小
int * new_arr = (int *)realloc(arr,sizeof(int) * (num + new_num));

// arr 和 new_arr 的内存地址是一样的(如果新增的空间不够了?)
//记得释放,不要重复free释放,记得判断,重复释放VS会崩溃,CLion不会崩溃
if (new_arr) {
  free(new_arr);
  new_arr = NULL;
  arr = NULL;
} else {
  //重新开辟失败的情况
  free(arr);
  arr = NULL;
}

6.字符串

char str[] = {'a' , 'b' , 'c' , 'd'};
//此时用pirntf打印会出现乱码 abcdxxx,xxx为系统值,因为printf遇到\0才会结束,例如
char str2[] = {'a' , 'b' , 'c' , 'd' ,'\0'};

char* str3 = "abcd";//这样写会隐士的加上\0

//可以修改,abcd是存在静态区域,然后会复制到栈空间,str2是指向栈空间,在栈空间进行操作不会报错
str2[2] = 'tt';

//不能修改,会报错,因为str3指向的是静态区域,系统会拒绝访问
str3[2] = 'tt';

获取长度

int getLen(char *arr) {
    int num = 0;
    while (*arr) { // *arr != '\0'
        arr ++;
        num ++;
    }
    return num;
}

获取长度的错误写法

//C/C++编译器,数组作为参数传递,会把数组优化为指针(为了效率)
int getLen2(char arr[]) {
    printf("arr = %d\n", sizeof(arr));
    printf("char = %d\n", sizeof(char));
    return sizeof(arr) / sizeof(int);
}

还有很多写法是传地址进来

void getLen(int *count, char *arr) {
    int num = 0;
    while (*arr) { // *arr != '\0'
        arr ++;
        num ++;
    }
    *count = num;
}

7.结构体

struct Person {
    char *name;
    int age;
    char sex
} p1 = {"chenqi", 18, 'G'},
        p2,
        p3;

//也可以这么写,cq就是别名
typedef struct  {
    char *name;
    int age;
    char sex
} cq;

int main() {
    printf("p1 %s %d %c\n",p1.name,p1.age,p1.sex);
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容