2017-02-18 69 views
2

該程序的目標是立即設置2D陣列的每個數組變量,在函數內初始化2D數組,通過指針調用。分段錯誤

char mass_data_shift [9] [9];等於'T'。整體上應該等於100Ts。

這是通過調用這個二維數組地址作爲參數的void函數完成的。用指針調用它然後在循環中初始化。

在循環內部是被2D陣列應被設置爲T.

* mass_data [mass_data_counter] [mass_data_counter_two] = 'T';

但是.....程序結果:

  • (最常見)分段錯誤試圖初始化* mass_data [4] [2]
  • (有時候)一後程序成功運行(?)後出現分段錯誤。
  • (有時)程序成功運行。

意思是程序在某處寫出界限。在程序運行時沒有分段錯誤和/或修復其他錯誤,任何幫助都將受到讚賞。

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

void mass_data_define(char (*mass_data)[9][9]){ 

    int mass_data_counter; 
    int mass_data_counter_two = 0; 

    for (mass_data_counter=0;mass_data_counter<9;mass_data_counter++){ 
    do {  
     std::cout << "|Array #1 " << mass_data_counter 
       << " ::: |Array #2 " << mass_data_counter_two 
       << std::endl; 

     *mass_data[mass_data_counter][mass_data_counter_two] = 'T'; 

     std::cout << *mass_data[mass_data_counter][mass_data_counter_two]; 

     mass_data_counter_two++; 
     std::cout << "---------End of Counter 2 Init Code----------" << std::endl; 
    } while (mass_data_counter_two < 9); 

    mass_data_counter_two = 0; 
    } 
} 

int main() 
{ 
    char mass_data_shift[9][9]; 

    mass_data_define(&mass_data_shift); 

    std::cout << "-END-" << std::endl; 

    return 0; 
} 

最終編輯:主要原因是由下面的szym解決。對於空格和丟失的iostream感到抱歉,當我發佈帖子時,這是一個格式問題。還改變了循環以適應數組長度,如下所示。

+1

您最多隻能有81個空格。 N的數組被索引爲0..N-1。在我看來,你認爲數組的大小是N + 1,因爲你說你的9x9數組有100個元素。它只能保持81. –

+1

看起來像從0到9循環。你的數組只支持0到8。 –

+0

好的,在我將循環更改爲0-8而不是0-9之後,仍然出現了分段錯誤。想法? –

回答

1
*mass_data[mass_data_counter][mass_data_counter_two] = 'T'; 

應該是

(*mass_data)[mass_data_counter][mass_data_counter_two] = 'T'; 

自然地,這同樣適用於線:

std::cout << *mass_data[mass_data_counter][mass_data_counter_two] 

但實際上此指針類型是沒有必要通過在C/C++引用傳遞數組。

而應該聲明:

void mass_data_define(char mass_data[9][9]) { 
    // To read: 
    char z = mass_data[3][6]; 
    // To write: 
    mass_data[2][1] = 'C'; 
} 

// elsewhere 
char my_mass_data[9][9]; 
mass_data_define(my_mass_data); 
+0

這裏的'* mass_data [mass_data_counter] [mass_data_counter_two]'究竟是什麼?它指向的是一些任意的地址嗎? –

+0

啊,是的,我會改變它不再使用指針。但是,從* mass_data [mass_data_counter] [mass_data_counter_two] ='T'更改它;到(* mass_data)[mass_data_counter] [mass_data_counter_two] ='T';當指針保持不變時, 仍然沒有修復分段錯誤。 –

+0

你是否更新了使用'* mass_data [x] [y]'而不是正確的'(* mass_data)[x] [y]'的兩種情況?我更新了答案。 – szym

0

答案很簡單:這裏有一個線修復您的代碼,以便可以繼續使用指針仍然得到一個分段錯誤:

 (*mass_data)[mass_data_counter][mass_data_counter_two] = 'T'; 

龍答案:閱讀Create a pointer to two-dimensional array

要深入瞭解如何訪問多維數組的指針,請閱讀this