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
相关产品推荐
相关产品推荐

