我有以下作业问题:
Consider the following declarations and answer the question.
char strarr1[10][32];
char *strarr2[10];
Are strarr1[3][4] and strarr2[3][4] both legal references?
我尝试用gcc编译代码来测试它。我很确定第二个引用会引发错误,但事实并非如此。这是我用gcc编译的:
int main(void){
char strarr1[10][32];
char *strarr2[10];
char x = strarr1[3][4];
char y = strarr2[3][4];
return 0;
}
我正在假设我使用的测试代码是正确的。
当strarr2是一维数组时,如何引用strarr2 [3] [4]?
答案 0 :(得分:1)
因为strarr2
是char *的数组,所以第二个[4]
是char *的索引
它意味着与此相同
char * temp = strarr2[3];
char y = temp[4];
由于我没有在代码中看到strarr2正在初始化的任何地方,也没有看到strarr2 [3]被分配的任何地方,因此这段代码将无法正常工作。它将返回垃圾或段错误。
答案 1 :(得分:1)
由于指针算术索引约定,它们都是合法语法。但是,在您的代码中:
char y = strarr2[3][4]; // <--- NOT SAFE!
正在访问未分配的内存并生成未定义的行为,因为它错误。
所以退出。
答案 2 :(得分:0)
它是指针的单维数组。因此,您将指针索引为3,偏移量= 4:
char y = *(strarr2[3] + 4);
与:
相同char y = strarr2[3][4];