字符数组与字符串本质差异(从内存角度分析)

这里写图片描述

#include <stdio.h>
#include <string.h> //未加头文件warning: 
//incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]


char c[5];//未显示初始化 存放在bss段,初始化0;

int main(void)
{
    char a[] = "linux";   
    char d[] = {'l', 'i', 'n', 'u', 'x', '\0'}; //a和d是一样的,a的“”只是编译器提供给我的一种手段。
    char b[5];//局部变量,存储在栈中脏值。

    printf("a[] = %d\n", sizeof(a));    
    printf("a[] = %d\n", strlen(a));

    printf("b[] = %d\n", sizeof(b));
    printf("b[] = %d\n", strlen(b));

    printf("c[] = %d\n", sizeof(c));
    printf("c[] = %d\n", strlen(c));

    printf("d[] = %d\n", sizeof(d));
    printf("d[] = %d\n", strlen(d));

    return 0;
}



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

char a[9];//使字符串存储在数据段bss

int main(void)
{
    char b[9];//使字符串存储在栈
    int i;
    char *p = (char *)malloc(10*sizeof(char));//使字符串存储在堆中
    if(NULL == p){
        printf("malloc erro\n");
        return 0;
    }

    char *pm = p;//保护现场首地址,free以及输出都是从首地址开始
    char *pa = a;//进行指向 然后通过指针进行填充值
    char *pb = b;

    //pa = "linux";//这句话的隐含意思就是 pa不指向a了,而是指向代码段的字符串“linux中”

    for(i = 0; i < 6; i++){//只能采用通过字符指针填充值进去的方法
        *p++ = 'i';//后增反正是先运算再加加 即使++先于p结合那也没用
        (*pa) = 'i';
        *pb = 'i';
        //p++;
        pa++;
        pb++;
    }
    *pa = '\0';
    *pb = '\0';
    *p = '\0';

    printf("a[] = %s\n", a);
    printf("b[] = %s\n", b);
    printf("pm = %s\n", pm);

    free(pm);


    return 0;
}

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值