char[] 与char[9]的不同。 sizeof(char*) != sizeof(char)

本文探讨了C语言中字符串处理的几个关键概念,包括字符数组与字符指针的区别,sizeof运算符在不同情况下的行为表现,以及局部变量作为函数返回值时可能出现的问题。

两个小问题:

 

1, char s[] = "12345";    // sizeof(s) = 6, 因为会自动为末尾加上'/0',  与char* s = "12345"一致

2, char s[5] = "12345"  //sizeof(s) = 5

 

 

1,char*   是不同于char 的另外一种指针类型。   sizeof(char*) = 4 这是由于用的操作系统是32位的缘故

 

 

 

 

注意: 在局部变量返回问题上,即

 

char* foo()

{

    char a[] = "12345“;

    return a;

}

 

在main函数里得到 也是乱码,即和char a[5]一样的效果。  可见char* , char[],char[n]  各有不同。

 

他们的本质如下:(标记。后补充!)

 

 

 

我们来逐个分析这些表达式的结果,并解释它们的含义。 --- ### 代码初始化: ```c unsigned char num[8] = {1, 9, 20, 50, 37, 18, 17}; // num[7] = 17,num[8] 未初始化 unsigned char *p = num; // p 指向 num[0] unsigned char *q = num; // q 也指向 num[0] ``` 数组 `num` 的内存布局如下(索引从0开始): | 索引 | 值 | |------|----| | 0 | 1 | | 1 | 9 | | 2 | 20 | | 3 | 50 | | 4 | 37 | | 5 | 18 | | 6 | 17 | | 7 | ? | (未初始化) --- ### 表达式分析 #### a = *p; - `p` 指向 `num[0]`,所以 `*p` 是 `num[0]` - **结果:a = 1** #### b = *p + 1; - `*p` 是 `1`,加 1 - **结果:b = 2** #### c = *(p + 1); - `p + 1` 指向 `num[1]` - **结果:c = 9** #### d = *p++; - `*p` 是 `1`,然后 `p++` 让 `p` 指向 `num[1]` - **结果:d = 1** #### e = *(p + sizeof(p)); - `sizeof(p)` 是指针大小,32位系统为4,64位系统为8 - `p` 当前指向 `num[1]`,加上指针大小后,越界访问 - **结果:不可预测(取决于系统)** #### f = *(p + sizeof(*p)); - `sizeof(*p)` 是 `unsigned char` 的大小,为 1 - `p + 1` 指向 `num[2]` - **结果:f = 20** #### g = *p + sizeof(p); - `*p` 是 `num[1] = 9`,`sizeof(p)` 是 4 或 8(取决于系统) - **结果:g = 9 + (4 或 8)** #### h = *p + sizeof(*p); - `*p` 是 `9`,`sizeof(*p)` 是 `1` - **结果:h = 10** #### i = *p; - `p` 当前指向 `num[1]` - **结果:i = 9** #### x = q[1]; - `q` 指向 `num[0]`,`q[1]` 是 `num[1]` - **结果:x = 9** #### y = p[0]; - `p` 指向 `num[1]`,所以 `p[0]` 是 `num[1]` - **结果:y = 9** #### m = p[sizeof(num) - sizeof(p) - 1]; - `sizeof(num)` 是 `8` 字节 - `sizeof(p)` 是 4 或 8(取决于系统) - 假设是 32 位系统,`sizeof(p) = 4` - `m = p[8 - 4 - 1] = p[3]`,即 `num[1 + 3] = num[4]` - **结果:m = 37** #### l = p[sizeof(num) - sizeof(*p) - 1]; - `sizeof(*p)` 是 1 - `p[8 - 1 - 1] = p[6]`,即 `num[1 + 6] = num[7]`(未初始化) - **结果:l = 不确定(未初始化值)** #### n = p[sizeof(num) - sizeof(p) - sizeof(q)]; - `sizeof(p)` 和 `sizeof(q)` 都是 4(32位系统) - `n = p[8 - 4 - 4] = p[0]`,即 `num[1]` - **结果:n = 9** --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值