2016-09-27 74 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,我很欣賞這種情緒。謝謝。 –