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

C语言嵌套字符串数组问题:sizeof计算结果不符求解

为什么sizeof(master_array[0])/sizeof(char*)结果为1而非预期的4?

问题根源

当你把数组名(比如arr1)赋值给master_array的元素时,数组会退化为指向其第一个元素的指针。master_array的类型是char**[],所以master_array[0]是一个char**类型的指针,而非数组。

  • sizeof(master_array[0])得到的是指针本身的大小(32位系统为4字节,64位系统为8字节)
  • sizeof(char*)同样是指针的大小
  • 两者相除结果自然是1,和原数组的元素个数无关

而arr1本身是数组类型(char*[4]),sizeof(arr1)是整个数组的总字节数(4 × 指针大小),除以sizeof(char*)就能得到元素个数4。

解决办法

如果需要在master_array中获取每个子数组的长度,必须手动存储长度信息,常见两种实现方式:

1. 使用平行数组记录长度

#include <stdio.h>

int main(void)
{
   char *arr1[] = {"apple", "pear", "banana", "melon"};
   char *arr2[] = {"carrot", "lettuce", "onion", "spinach"};
   char *arr3[] = {"Tom", "Smith", "Dave", "John"};
   char **master_array[] = {arr1, arr2, arr3};
   // 平行数组存储每个子数组的元素个数
   size_t arr_lengths[] = {sizeof(arr1)/sizeof(char*), sizeof(arr2)/sizeof(char*), sizeof(arr3)/sizeof(char*)};

   printf("arr1[1] = %s\n", arr1[1]);
   printf("arr2[1] = %s\n", arr2[1]);
   printf("arr3[1] = %s\n", arr3[1]);
   printf("master_array[1][2] = %s\n", master_array[1][2]);

   printf("sizeof(arr1) = %ld\n", sizeof(arr1)/sizeof(char *));
   printf("length of master_array[0] = %ld\n", arr_lengths[0]);

   return 0;
}

2. 使用结构体绑定数组指针与长度

#include <stdio.h>

// 定义结构体,封装字符串数组指针和长度
typedef struct {
    char **arr;
    size_t length;
} StringArray;

int main(void)
{
   char *arr1[] = {"apple", "pear", "banana", "melon"};
   char *arr2[] = {"carrot", "lettuce", "onion", "spinach"};
   char *arr3[] = {"Tom", "Smith", "Dave", "John"};
   // 初始化结构体数组
   StringArray master_array[] = {
       {arr1, sizeof(arr1)/sizeof(char*)},
       {arr2, sizeof(arr2)/sizeof(char*)},
       {arr3, sizeof(arr3)/sizeof(char*)},
   };

   printf("arr1[1] = %s\n", arr1[1]);
   printf("arr2[1] = %s\n", arr2[1]);
   printf("arr3[1] = %s\n", arr3[1]);
   printf("master_array[1].arr[2] = %s\n", master_array[1].arr[2]);

   printf("sizeof(arr1) = %ld\n", sizeof(arr1)/sizeof(char *));
   printf("length of master_array[0] = %ld\n", master_array[0].length);

   return 0;
}

总结

C语言中,数组退化为指针后无法通过指针还原原数组的长度信息,必须额外存储长度。这是数组和指针的核心差异之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:15:36