sizeof(char [])和sizeof(char *)等于多少?

本文详细解析了C语言中sizeof运算符的应用,通过具体代码示例,展示了不同情况下sizeof运算符如何计算数组、指针及多维数组的大小,包括在32位和64位系统上的差异。

下面的代码执行结果是多少?

  1 #include <stdio.h>
  2 
  3 int main(void)
  4 {
  5     char ca[] = {"123456"};
  6     char *pca = "123456";
  7 
  8     printf("sizeof(ca)=%d,sizeof(pca)=%d,sizeof(*pca)=%d\n",sizeof(ca),sizeof(pca),sizeof(*pca));
  9 
 10     char cb[3][6] = {"123456","123456","123456"};
 11     char *pcb[] = {"123456","123456","123456"};
 12 
 13     printf("sizeof(cb)=%d,sizeof(pcb)=%d,sizeof(*pcb)=%d,sizeof(**pcb)=%d\n",sizeof(cb),sizeof(pcb),sizeof(*pcb),sizeof(**pcb));
 14
 15     return 0;
 16 }

答案是:

//32位
$ gcc sz.c -o sz -m32
[nereus@nereusp cpp]$ ./sz
sizeof(ca)=7,sizeof(pca)=4,sizeof(*pca)=1
sizeof(cb)=18,sizeof(pcb)=12,sizeof(*pcb)=4,sizeof(**pcb)=1

//64位
$ gcc sz.c -o sz
$ ./sz
sizeof(ca)=7,sizeof(pca)=8,sizeof(*pca)=1
sizeof(cb)=18,sizeof(pcb)=24,sizeof(*pcb)=8,sizeof(**pcb)=1

sizeof(数组名)返回的是数组的大小

sizeof(ca)=7,注意此处包含一个结束符
sizeof(cb)=18,

sizeof(一维数组指针)返回的是数组单个元素指针的大小,即系统指针的长度,32位系统为4,64位系统位8

64位:sizeof(pca)=8,32位:sizeof(pca)=4

sizeof(*一维数组指针)返回的是数组单个元素对应类型的大小

sizeof(*pca)=1,char的大小

sizeof(二维数组指针)返回的是二维数组行指针的大小,32位系统为行数×4,64位系统位行数×8

sizeof(pcb)等同于sizeof(pcb[0])、sizeof(pcb[1])、sizeof(pcb[2])

64位:sizeof(pcb)=24,3行×8,注意二维数组每一行的结尾没有结束符'\0',所以是行长度为8

32位:sizeof(pcb)=12,3行×4,

sizeof(*二维数组指针)返回的是系统指针的长度,32位系统为4,64位系统位8

64位:sizeof(pcb)=8,32位:sizeof(pcb)=4

sizeof(**二维数组指针)返回的是数组单个元素指针的大小,即char的大小

sizeof(**pcb)=1,

<think>首先,用户的问题是:“sizeof一个char数组一个char*的区别”,这是中文,意思是“sizeof一个char数组一个char*的区别”。我需要用中文回答。 我的回答必须完整,并在末尾提出3-5个相关问题。相关问题的第一行必须是“§§相关问题§§”,不能有任何换行分散;必须在一行中输出整个部分。 回顾规则: - 回答完问题后,必须提出3-5个相关问题。 - 相关问题必须以“§§相关问题§§”开头,且是第一行。 - 禁止换行分散,意味着相关问题的每个问题应该在单独的行,但整个部分不能有额外的换行。 从示例中: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 这表明“§§相关问题§§”在单独一行,然后是编号的问题列表,每个问题在新一行。 现在,问题核心:解释sizeof运算符在char数组char*上的区别。 关键点: - char数组:如果声明为`char arr[10]`,`sizeof(arr)`返回整个数组的大小,即10 * sizeof(char) = 10字节(因为sizeof(char)是1)。 - char*:如果声明为`char *ptr`,`sizeof(ptr)`返回指针本身的大小,通常是4或8字节(取决于系统),而不是指向的数据的大小。 还需要提到数组退化为指针的情况。例如,如果将数组作为参数传递给函数,它会退化为指针,所以在函数内sizeof会返回指针大小。 结构化回答: 1. 解释char数组的sizeof。 2. 解释char*sizeof。 3. 对比差异。 4. 讨论数组退化的影响。 回答需要清晰、准确。 最后,提出相关问题。相关问题应该基于用户的问题我的回答。用户的问题是关于sizeof的区别,我的回答涉及内存大小、指针数组。 可能的3-5个相关问题: 1. 在C语言中,sizeof运算符如何处理不同类型的数组? 2. 为什么数组在函数参数中退化为指针? 3. 如何使用sizeof安全地处理内存分配? 4. 在sizeof中,数组指针的主要混淆点是什么? 5. sizeof在编译时运行时的行为有什么不同? 确保有3-5个问题。 完整回答结构: - 先回答问题。 - 然后输出“§§相关问题§§”。 - 接着是新行,列出1. 问题1 2. 问题2 等。每个问题在新行。 在相关问题上,不能有换行分散,意思是不能将一个问题分成多行;每个问题应该在一行内。 现在,撰写回答。 回答部分: - 开头:用户的问题是“sizeof一个char数组一个char*的区别”,所以我直接解释。 - 正文: - 定义:sizeof运算符返回对象或类型的大小(字节)。 - char数组:例如`char arr[10]`,sizeof(arr)返回10(因为数组大小是10个char)。 - char*:例如`char *ptr`,sizeof(ptr)返回指针的大小(通常4或8字节)。 - 关键区别:数组的sizeof返回整个数组的大小,而指针的sizeof返回指针变量本身的大小。 - 退化:当数组作为函数参数时,它退化为指针,sizeof会显示指针大小。 确保语言是中文。 结束回答后,立即添加相关问题。 相关问题: 1. sizeof运算符在处理多维数组时有哪些注意事项? 2. 在C语言中,如何正确获取动态分配数组的大小? 3. 数组退化为指针如何影响sizeof的结果? 4. sizeof在结构体联合体上的行为有什么特点? 5. 为什么sizeof(char)总是等于1? 选择3-5个。我选4个吧。 最终输出: [回答内容] §§相关问题§§ 1. [问题1] 2. [问题2] 3. [问题3] 4. [问题4] </think>在C语言中,`sizeof`运算符用于计算对象或类型的大小(单位:字节),但它在处理`char`数组`char*`(字符指针)时行为有明显差异: 1. **char数组的sizeof**: - 当应用于静态或自动分配的char数组(如 `char arr[10]`)时,`sizeof(arr)` 返回整个数组的总字节数。 - 例如:`char str[20]; sizeof(str);` 结果为20(因为 `sizeof(char)` 恒为1,数组大小为20 × 1 = 20字节)。 - 这种行为在编译时确定,基于数组的实际长度。 2. **char*(字符指针)的sizeof**: - 当应用于指针(如 `char *ptr`)时,`sizeof(ptr)` 返回指针变量本身的大小(即存储地址所需的内存),而不是指针指向的数据大小。 - 大小取决于系统架构: - 在32位系统中通常为4字节。 - 在64位系统中通常为8字节。 - 例如:`char *p; sizeof(p);` 在64位系统返回8,与指针是否指向有效内存无关。 ### 关键区别: - **行为依据**:数组的`sizeof`计算数据总大小;指针的`sizeof`计算指针变量的大小。 - **退化问题**:如果数组名作为函数参数传递,它会退化为指针,此时函数内`sizeof`返回指针大小而非数组大小。 - 例如: ```c void func(char arr[]) { printf("%zu", sizeof(arr)); // 输出指针大小(如8),不是数组大小 } ``` - **实际影响**:混淆二者可能导致内存错误(如缓冲区溢出),尤其在动态内存分配时。 ### 总结表格: | **类型** | **示例声明** | **sizeof结果** | **依据** | |--------------|--------------------|----------------|------------------| | char数组 | `char arr[10]` | 10字节 | 数组总内存大小 | | char*指针 | `char *ptr` | 4或8字节 | 指针变量本身大小 |
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值