寻址具有两个维度的单维指针数组

时间:2010-02-09 02:08:24

标签: c arrays pointers multidimensional-array

我有以下作业问题:

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]?

3 个答案:

答案 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];