【问题标题】:Precise Syntax for Accessing Elements in a 2D Array - by Pointer?访问二维数组中元素的精确语法 - 通过指针?
【发布时间】:2016-09-27 19:16:06
【问题描述】:

我是一名正在做作业的 CS 学生,我需要有关 C 语法问题的帮助。昨天在课堂上,我的教授说,“一个 int** 指针是一个指向 2D int 数组的指针。”这让我大吃一惊。

事实证明,我们必须编写一个 C 程序,从文件中读取一个 int 矩阵,然后对该矩阵进行操作。例如,“matrix1.txt”可能如下所示:

 1   2   3   4   5
 6   7   8   9  10
11  12  13  14  15

...对于 5x3 矩阵。我从另一个文件中获取矩阵的尺寸,这是我已经解决的问题。但关键是我必须使用变量动态分配矩阵数组。

这是我的问题:使用 int** 指针指向 malloc() 一个 Y-by-X 数组很容易......但是访问它的语法是什么?这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){

    char *myFile = argv[1];
    FILE *targetFile;
    targetFile = fopen(myFile, "r");

    if (targetFile == NULL)
        return -1;
    else {
        // Successfully opened "matrix1.txt" file
        int x, y;                                           // dimensions of the array, learned elsewhere...
        int i, j;
        char* data = NULL;

        int** matrix = (int**)malloc((x*y)*sizeof(int));    // allocate memory for an Y-by-X array

        for(i=0; i<y; i++){
            for(j=0; j<x; j++){
                fscanf(targetFile, "%c ", &data);
                matrix[i][j] = atoi(data);                  // program seg faults here
            }
        }
    }
    fclose(targetFile);
    return 1;
}

问题是“matrix[i][j] = atoi(data);”线;我要么使用了错误的语法,要么没有初始化数组。我不知道是哪个 - 一旦我在 GDB 调试器中点击这一行,程序段就会立即出错。

我确定这是一个 C 101 类型的问题......但我发布这个是因为我已经阅读了很多关于 2D 数组和指针的不同帖子,但我似乎无法找到一个例子符合我的具体情况。谁能帮我解决这个问题?

 Thanks,
   -ROA

【问题讨论】:

  • 顺便说一句,fscanf(targetFile, "%c ", &amp;data); 会在你修复内存分配问题后导致问题。只需使用int 变量和%d 格式从文件中读取。 int data; ... fscanf(targetFile, "%d", &amp;data);.
  • 你的教授是另一个混​​淆指针和数组的人。我想知道他还教了哪些其他误解。就是说,您的问题中没有二维数组,也没有可以表示一对一的东西。指针不是数组。
  • @RSahu:那个答案没有显示二维数组。提议的 dup 也没有显示一个!问题显然是混淆了什么是二维数组,以及如何使用指向它的指针。
  • 有关二维数组的一些信息请参见此处:stackoverflow.com/a/35615201/4774918
  • @RSahu 谢谢,感谢您的帮助。您指向我的帖子实际上非常令人困惑……但是该帖子指向了第二个帖子,该帖子很好地介绍了 int** 指针的逻辑。这是一个比我想象的更难的话题......

标签: c arrays pointers multidimensional-array malloc


【解决方案1】:

中使用的语法

matrix[i][j] = atoi(data);

不正确。是分配内存的逻辑不对。

为二维数组分配内存的一种方法是:

// Allocate memory for y number of int*s.
int** matrix = malloc(y*sizeof(int*));
for(i=0; i<y; i++)
{
   // Allocate memory for x number of ints.
   matrix[i] = malloc(x*sizeof(int));
   for(j=0; j<x; j++)
   {
      // Assign to the ints
      matrix[i][j] = <some value>;
   }
}

要读取数据,请使用

int data;

fscanf(targetFile, "%d", &data);

那么,上面的内循环可以更新为:

   for(j=0; j<x; j++)
   {
      // Assign to the ints
      fscanf(targetFile, "%d", &data);
      matrix[i][j] = data;
   }

确保添加代码以释放动态分配的内存。

// Free the memory allocated for the ints
for(i=0; i<y; i++)
{
   free(matrix[i])
}

// Free the memory allocated for the int*s
free(matrix);

【讨论】:

  • 啊啊啊啊啊……!这太棒了,谢谢!我阅读了其他帖子,但这非常非常清楚。谢谢,我喜欢这个。如果你曾经在新泽西州,找我,我欠你一杯啤酒……:)
  • @Pete,我很欣赏这种情绪。谢谢。
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多