Array Lengths in Function Signatures: A Confounding Anomaly
In C and C , function signatures often include array lengths enclosed in square brackets, such as in the example:
int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; }
However, this syntax appears to have no practical effect, as illustrated by the fact that the above code successfully accesses elements beyond the declared length of the array. This raises the question: why do compilers allow this seemingly redundant notation?
The answer lies in the implementation details of array handling in C and C . An array in C and C is本质上an address pointing to the first element of the array. When an array is passed to a function, its address is copied over, effectively passing a pointer.
In the example above, the function dis takes an array of characters a with a declared length of 1. However, since arrays are passed as pointers, the length specification is irrelevant and the function can access any element of the array, even if the index exceeds the declared length.
This inconsistency in the parameter syntax has been a subject of debate for decades since its introduction in the early days of these languages. While some argued for a more consistent syntax, others cited compatibility with legacy code as a reason to maintain the current behavior.
Despite the confusion it can cause, the tolerance of arrays with unspecified lengths in function signatures is a byproduct of the pointer-based implementation of arrays in C and C . It serves as a reminder of the subtle nuances that can arise from the interaction between different language features.
The above is the detailed content of Why Do C and C Function Signatures Allow Array Lengths That Have No Effect?. For more information, please follow other related articles on the PHP Chinese website!