&gt; &lt;...&gt; it is in <i>general</i> impossible to know runtime size of string at compile-time &lt;...&gt;<p>You are stepping on the same rake as beginners: generalizing from a specific case instead of applying the general case to specific circumstances. I have stressed the word &quot;in general&quot;. You may treat it like a cop-out or you can say that there are no special-case semantics here. Not sure if it was intentional, but your example is rather tricky. Until you step out of the box and see that we are no longer dealing with strings&#x2F;arrays&#x2F;pointers here, but structs, that have a bit different semantics.<p>&gt; Since there are no strings<p>Yes, there is no explicit string type in a language, but somehow we do use strings in C. Semantics. We can semantically treat a particular block of memory as a string, time-series, binary tree, etc.. There is simply no special case (explicit language support) for strings.<p>&gt; it cannot be true that strings are pointers. They can be arrays, and array sizes are known at compile time.<p>What about `malloc`? What about passing arrays between compilation units? I have covered this in SO[1]. Note that I never explicitly pass pointers, yet `sizeof()` thinks I do. Array sizes can, in some circumstances, be known at compile time in a specific program block, but not in general.<p>I&#x27;d say there are +&#x2F;- 3 types of languages (core, no stdlib, etc) in this context: 1) provide common-special-case exceptions 2) wrap all cases in an easy-to-use interface 3) provide general case syntax. 1) languages with `=` and `eq` (Perl?) 2) languages with object-identity (Python?) 3) C<p>[1]: <a href="http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;19589193&#x2F;2d-array-and-function&#x2F;19629508#19629508" rel="nofollow">http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;19589193&#x2F;2d-array-and-fun...</a>