2012-01-29 48 views
1

我需要存儲點(x,y)的數組。我從一個文件中讀取點數,並且點數不是恆定的,但是我可以在文件的第一行得到它。所以我寫了一個過程load()來加載文件中的點並將它們存儲在一個全局數組中。它不起作用。 我的代碼:在運行時初始化全局2維C數組整數

int *array[][]; // this is a pointer to a 2-dimensional array?? 

void load(){ 
.. 
int tempArray[2][n]; //n is the first line of the file 
.. 
array = tempArray; 
} 

回答

3

你試圖返回一個指針到內存是本地定義變量的函數。一旦該函數停止運行(「超出範圍」),該內存將被重新用於其他內容,因此稍後嘗試引用該內存是非法的。

你應該看看動態分配,並讓加載函數分配所需的內存並返回它。

的函數原型可能是:

int * read_points(const char *filename, size_t *num_points); 

哪裏filename當然是要打開的文件的名稱,num_points設置爲發現的點數,返回值是一個指向數組的指針保持x和y值,交錯。因此,這將打印加載的第一個點的座標:

size_t num_points; 
int *points; 

if((points = load_points("my_points.txt", &num_points)) != NULL) 
{ 
    if(num_points > 0) 
    printf("the first point is (%d,%d)\n", points[0], points[1]); 
    free(points); 
} 
0

一個更優雅的版本可能是這樣的:

typedef struct point_ { int x; int y; } point; 

point * create_array(size_t n) 
{ 
    return calloc(n, sizeof(point)); 
} 

void free_array(point * p) 
{ 
    free(p); 
} 

int main() 
{ 
    size_t len = read_number_from_file(); 
    point * data = create_array(len); 

    if (!data) { panic_and_die(); } 

    for (size_t i = 0; i != len; ++i) 
    { 
     /* manipulate data[i].x and data[i].y */ 
    } 

    free_array(data); 
    data = 0;   /* some people like to do this */ 
} 
0

您試圖分配一個數組,但在C數組不能分配。使用memcpy將一個數組複製到另一個數組。 C中的數組元素保證是連續的。

int bla[N][M] = {0}; 
int blop[N][M]; 

/* Copy bla array to blop */ 
memcpy(blop, bla, sizeof blop); 
2

你的這項聲明不起作用:

int *array[][]; // this is a pointer to a 2-dimensional array?? 

首先,它試圖申報int *二維數組。其次,當你聲明或定義一個數組時,除第一個之外的所有維都必須被指定(大小)。

int (*array)[][2]; // This is a pointer to a 2D array of unknown size 

這現在可以在你的函數的一個主要變體中使用。這是一個變種,因爲我起初誤解了你的問題。

void load(void) 
{ 
    ... 
    int tempArray[n][2]; // Note the reversed order of dimensions! 
    ... 
    array = &tempArray; 
    ...there must be some code here calling functions that use array... 
    array = 0; 
} 

請注意,該作業需要數組名稱上的&。在其他函數中,您需要編寫以下代碼:

n = (*array)[i][j]; 

注意,將局部數組的地址賦值給全局變量也是危險的。一旦功能load()返回,tempArray的存儲空間不再有效。因此,進行賦值的唯一安全方法是調用引用全局變量的函數,然後在退出函數之前重置全局變量。 (或者至少認識到該值是無效的,但將其設置爲零 - 空指針 - 將更接近確保程序崩潰,而不是僅訪問隨機存儲器。爲陣列動態分配內存。

你的問題其實就是想使一個全球性的指針VLA,變長數組,其中變量維度是不是第一次:

int tempArray[2][n]; // Note the reversed order of dimensions! 

你根本無法建立一個全球性的指針,這樣數組。

因此,有多個問題:

  • 符號爲指向數組
  • 初始化指向數組
  • 分配全局指針局部變量
  • 你不能有全球指針到多其中可變長度不在第一維中的三維VLA。
  • 您應該儘量減少使用全局變量。