C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )相关的知识,希望对你有一定的参考价值。





一、字符串 一级指针 内存模型



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*
 * 函数入口
 */
int main(int argc, char **args)


    // 栈内存数组 指定大小
    char array[5] = "abc";

    // 栈内存数组 不指定大小
    char array2[] = "123";

    // 定义指针 , 使用字符串赋值
    char *p = "def";

    // 定义指针 , 在堆内存中分配 5 字节空间
    char *p2 = malloc(5);

    // 将字符串拷贝到堆内存中
    strcpy(p2, "456");

    system("pause");
    return 0;


绘制上述代码的 内存四区 模型 ;



1、指定大小字符数组


下面的代码中 , 在栈内存中 , 声明 数组 , 数组大小 5 5 5 字节 , 为其赋值时 , 使用了 “abc” 字符串常量 ;

在 全局区 的 常量区 存放 “abc” 字符串常量 ;

使用 “abc” 常量为 数组 赋值 , 注意数组的最后一位是 \\0 字符 ;

    // 栈内存数组 指定大小
    char array[5] = "abc";


2、未指定大小字符数组


在 栈内存 中 , 声明 不指定大小的 字符数组 , 初始化 “123” 字符串 ;

在 全局区 的 常量区 中 , 存放 “123” 常量字符串 ;

在 栈区 的 array2 数组中 , 存放 “123” 字符串内容 , 注意最后的 \\0 字符 , 该数组大小 4 4 4 字节 ;

    // 栈内存数组 不指定大小
    char array2[] = "123";


3、指向常量字符串的指针


在 栈内存 中 , 定义 局部变量 指针 p , 没有为该指针分配内存 , 该指针指向 字符串常量 “def” ;

在 全局区 的 常量区 中 , 定义 字符串常量 “def” ;

    // 定义指针 , 使用字符串赋值
    char *p = "def";


4、指向堆内存的指针


先在 堆内存 中 , 分配 5 字节内存 ;

然后 在 全局区 的常量区 中 , 定义 字符串常量 “456” ;

最后 将 字符串常量 “456” 拷贝到 堆内存 分配的 内存中 ;

    // 定义指针 , 在堆内存中分配 5 字节空间
    char *p2 = malloc(5);

    // 将字符串拷贝到堆内存中
    strcpy(p2, "456");

以上是关于C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )的主要内容,如果未能解决你的问题,请参考以下文章

C语言提高内容目录

字符串字符串数组与一级指针

C 语言一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

C语言 二级指针内存模型

C 语言二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )