2016-04-25 57 views
-1

我的目標:這是一個程序,它接收用戶指定的數字以生成大小爲全球的二維數組, 「尺寸」列
這是一個更大的程序我的工作,這需要該陣列是全球C-2D全局數組 - >在大小> 4時運行到分段錯誤

前的一小部分的量:用戶運行與./a.out 5 的節目的節目製作5行5列的全球陣列,並將其輸出給用戶

我的問題:可以創建大小爲0,1,2,3和4的數組,而沒有問題。只要我用5的用戶輸入運行程序,它給我一個分段錯誤。這似乎與最後一行(S)的一個問題,但我不明白爲什麼它爲輸入> = 5

我做了什麼/試過:雖然陣列必須是全球 ,我試圖通過將「int **」放在「array =」代碼的前面來讓數組不是全局數組。這不會改變我的問題,所以我不認爲這與它是全球

我的問題,要做到:

  1. 爲什麼我的程序給我一個分段錯誤的輸入時 大於或等於5?

  2. 我該如何讓它接受大數字的輸入而仍然 保持它作爲一個全局數組?

我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
//method declarations 
void fill_array(); 
//global variables 
int **array; 
int size; 

int main(int argc, char** argv){ 
    //fill the array with size specified by user 
    //ASSUME THE USER INPUT TO BE A VALID INTEGER 
    if(argc==2){ 
     fill_array(argv); 
    } 
} 

void fill_array(char** argv){ 

    //initialize the variables 
    int i,j;//loop counters 

    //set size of array 
    size = atoi(argv[1]); 

    //make array of size 'size' 
    int **array = (int**)malloc(size*sizeof(int));//initialize the array to hold ints 
    for(i=0; i<size; i++){ 
     array[i] = (int*) malloc(size*sizeof(int));//initialize the second dimension of the array 
    } 

    //fill the array with values of i*j 
    for(i=0; i<size; i++){ 
     for(j=0; j<size; j++){ 
      printf("i: %d and j: %d ",i,j); 
      array[i][j] = i*j;//put a value in the array 
      printf("... and we succeeded\n"); 
     } 
    } 

    //print the array when we are done with it 
    for(i=0; i<size; i++){ 
     for(j=0; j<size; j++){ 
      printf("%d ",array[i][j]); 
     } 
     printf("\n"); 
    } 
} 
+0

歡迎來到Stack Overflow!這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:[如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+0

請注意,它是[多餘的並且潛在危險的是將malloc和朋友的結果轉換爲C](http://stackoverflow.com/q/605845/253056)。 –

+2

爲什麼你重新聲明'int **數組'?第一個malloc應該是'malloc(size * sizeof(* int))'。但我認爲,調試必須是你的方式。 –

回答

1

這條線:

int **array = (int**)malloc(size*sizeof(int));//initialize the array to hold ints 

應該是:

int **array = malloc(size*sizeof(int*));//initialize the array to hold ints 
            ^^^ 

而且,這個原型:

void fill_array(); 

應該是:

void fill_array(char** argv); 

此外,您應該作爲一般規則,避免全局 - 移動的sizearray聲明適當的函數內並在需要它們作爲參數傳遞。

+0

因爲當sizeof指針與sizeof int相同時,它可以工作,但是當問題標題詢問... –

相關問題