【问题标题】:Addressing a single dimensional pointer array with two dimensions寻址具有二维的一维指针数组
【发布时间】:2010-02-09 02:08:23
【问题描述】:

我有以下作业问题:

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

【问题讨论】:

    标签: c arrays pointers multidimensional-array


    【解决方案1】:

    由于strarr2 是一个char* 数组,第二个[4] 是char* 的索引

    和这个意思一样

    char * temp = strarr2[3];
    char y = temp[4];
    

    由于我在您的代码中没有看到正在初始化 strarr2 的任何地方,也没有看到正在分配 strarr2[3] 的任何地方,因此该代码将无法正常工作。它将返回垃圾或段错误。

    【讨论】:

      【解决方案2】:

      由于指针算术索引约定,它们都是合法的语法。但是,在您的代码中:

      char y = strarr2[3][4];  // <--- NOT SAFE!
      

      正在访问未分配的内存并产生未定义的行为,因此它是不好的

      所以放弃吧。

      【讨论】:

        【解决方案3】:

        它是指针的一维数组。因此,您在 3 处使用 offset=4 索引指针:

        char y = *(strarr2[3] + 4);
        

        等同于:

        char y = strarr2[3][4];
        

        【讨论】:

          猜你喜欢
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          相关资源
          最近更新 更多