2016-09-27 36 views
1

我是CS学生,主要从事家庭作业,我需要关于C语法问题的帮助。昨天在课堂上,我的教授说:“一个int **指针是指向一个2D int数组的指针。”这让我大跌眼镜。原来,我们必须编写一个C程序,它从文件中读取一个int矩阵,然后对该矩阵进行操作。例如,“matrix1.txt”可能如下所示:访问2D数组中元素的精确语法 - 通过指针?

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 
+0

BTW,'的fscanf(的TargetFile,“%C”,&data);'您解决内存分配问题后会导致问题。只需使用一个'int'变量,'%D'格式从文件中读取。int data; ... fscanf(targetFile,“%d”,&data);'。 –

+0

你的教授是另一个混​​淆指针和数组的人,我不知道他教导的其他错误概念是什么。在你的问题中没有二维数组,也没有可以表示指向一个点的东西,指针不是一个数组 – Olaf

+0

@RSahu:这个答案不显示二维数组,也不是提出的dup显示一个!混淆了二维数组是什么,并指出如何使用它的指针 – Olaf

回答

1

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

使用的语法不是不正确。这是用来分配内存的逻辑是错误的。

一种用于2D阵列分配内存的方法是:

// 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); 
+0

Ahhhhhhhh ...!这真棒,谢谢!我读过其他帖子,但这非常非常清楚。谢谢,我喜欢这个。如果你曾经在新泽西州,看看我,我欠你一杯啤酒...... :) – Pete

+0

@Pete,我很欣赏这种情绪。谢谢。 –