I have the following homework question:
Consider the following declarations and answer the question.
char strarr1[10][3开发者_C百科2];
char *strarr2[10];
Are strarr1[3][4] and strarr2[3][4] both legal references?
I tried compiling the code with gcc to test it. I was fairly sure that the second reference would throw an error, but it didn't. This is what I compiled with gcc:
int main(void){
char strarr1[10][32];
char *strarr2[10];
char x = strarr1[3][4];
char y = strarr2[3][4];
return 0;
}
I'm working under the assumption that the test code I used is correct.
How is it possible to reference strarr2[3][4] when strarr2 is a single-dimensional array?
since strarr2
is an array of char*, the second [4]
is an index into the char*
it means the same thing as this
char * temp = strarr2[3];
char y = temp[4];
Since I don't see anywhere in your code where strarr2 is being initialized, nor do I see anywhere that strarr2[3] is being allocated, this code will not work as presented. It will either return garbage or segfault.
They are both legal syntax because of the pointer arithmetic indexing convention. However, in your code:
char y = strarr2[3][4]; // <--- NOT SAFE!
is accessing unallocated memory and generates undefined behavior, ergo it is bad.
So quit it.
It is a single dimensional array of pointers. So, you are indexing the pointer at 3 with offset=4:
char y = *(strarr2[3] + 4);
is the same as:
char y = strarr2[3][4];
精彩评论