为什么编译器不能为字符串数组派生字符串长度?

Leo*_*Hat 4 c string stack memory-management

注意:这个问题受到这个答案的影响.

以下是有效的C代码:

char myString[] = "This is my string";
Run Code Online (Sandbox Code Playgroud)

这将\0在堆栈上分配长度为18(包括字符)的字符串,并为其指定值.

但是,以下内容:

char myStrings[][] = {"My 1st string", "My 2nd string", "My 3rd string"};
Run Code Online (Sandbox Code Playgroud)

无效,给出错误"数组类型具有不完整的元素类型".

所以我必须像这样指定数组:

char myStrings[][20] = {"My 1st string", "My 2nd string", "My 3rd string"};
Run Code Online (Sandbox Code Playgroud)

其中20是一个大于我最长字符串的数字.

这编译并按预期工作.

如果编译器在堆栈上分配单个字符串时可以动态地感知字符串长度,为什么不能对字符串数组这样做呢?

编辑:

只是为了澄清,这不是我遇到的现实生活中的编程问题 - 这只是病态的好奇心.

AnT*_*AnT 5

有一点是"感知"一根弦的长度.另一件事是计算许多字符串的最大长度.两者之间存在某种直观的质的差异.因此,语言作者可能认为前者简单而有用,但后者过于编译且不太有用.