You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中char指针数组与数组指针sizeof计算结果差异问题

问题核心原因:两个变量的类型完全不同

C语言的声明解析遵循运算符优先级规则:数组下标[]的优先级高于解引用*,括号会改变默认结合顺序,两个声明的含义从根上就不一样。

  • 对于char *t1[10];
    没有括号改变优先级,t1首先和[10]结合,说明t1本身是长度为10的数组,数组存储的每个元素类型是char*(字符指针)。
    从你的运行结果可以判断当前是64位环境,64位系统下任意类型指针的占用大小都是8字节,因此整个数组的总大小为10 * 8 = 80字节。
    注意:sizeof是少数不会触发数组名退化为指针的运算符,因此这里拿到的是整个数组的实际占用大小,不是首元素指针的大小。如果把t1作为参数传入函数,在函数内部对形参做sizeof计算只会得到指针的大小8。
  • 对于char(*t2)[10];
    括号强制让t2首先和*结合,说明t2本身是一个指针,它指向的目标类型是「长度为10的char类型数组」。
    不管指针指向的目标是什么类型,指针本身存储的只是一个内存地址,64位环境下地址长度固定为8字节,因此sizeof(t2)的结果为8。

你可以用下面的代码验证两者的类型差异:

#include <stdio.h>
int main() {
    char *t1[10];
    char(*t2)[10];
    char test_arr[10] = "test";
    t2 = &test_arr; // 合法操作,符合t2的指针类型定义
    printf("t1单个元素大小: %zu\n", sizeof(t1[0])); // 输出8,t1[0]是char*类型
    printf("t2指向目标的大小: %zu\n", sizeof(*t2)); // 输出10,*t2是长度为10的char数组
    return 0;
}

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:18:52