c语言(二)-字符串操作、内存四区

431 阅读2分钟

本篇文章主要记录下字符串相关操作,以及内存四区

字符串

在c语言中没有字符串类型,c语言是通过数组来模拟的,可以通过两种方式来表示字符串

//通过数组来表示,这个时候会在数组的末尾有个'\0'字符,用于表示字符串结束
char string1[] = "abcd";
//通过指针来表示
char *string2 = "abcd";

跟字符串相关很重要的一个知识点是:字符串的处理函数,需要引入头文件string.h。这里介绍几个常用的

  • strlen 获取字符串的长度
  • strcmp 比较字符串
  • strcpy 复制字符串
  • strncpy 复制指定个数的字符串
  • strcat 字符串拼接
  • strncat 拼接指定个数字符串
  • strstr 查找字符串
  • strchr 查找字符
  • strtok 字符串分割

内存四区

之前介绍过,c语言是偏底层的语言,因为其可以使用指针直接操作内存。为了更好的了解使用c语言,有必要掌握c语言的内存模型。

c语言内存会被划分为4个区。栈区 堆区 全局区(分为已初始化,未初始化变量) 代码区

  • 栈区 函数中定义的变量等都在栈区分配内存。其分配与释放都是系统来控制,无需手动释放

  • 堆区 通过malloc函数手动分配的内存在堆区,在堆区分配的内存需要用free函数来手动释放,否则一直到程序结束

  • 全局区 全局变量 字符串等会存储在全局区。全局区在程序运行生命周期中不会释放。

//hello world 会存储在全局区  字符串都是常量,java中也一样
char *string = "hello world";
  • 代码区 代码存放的位置
char * testMalloc()
{
    //在堆上分配100字节的空间
    char *str = (char *)malloc(100);
    //给str指向的内存空间赋值hello world
    strcpy(str, "hello world");
    
    //返回str,这样外部就可以通过这个函数的返回值操作堆上的内容了
    return str;
}

int main()
{
    //调用函数返回个指针,也就是个地址
    char *str = testMalloc();
    //对str指向的字符串进行输出
    printf("string is %s\n", str);
    if (str != NULL)
    {
        //把堆上的内存进行释放
        free(str);
        str = NULL;
    }
    return 0;
}

重点:堆上分配的内存一定要记得释放