2010-09-10 59 views
1

我有一個令人困惑的問題 - 對我來說,至少,這可能是非常簡單,我錯過了一些東西。我正在嘗試初始化一個可變大小的二維數組,該數組是一個結構的一部分。我沒有問題爲陣列分配內存,但是當我嘗試將字符分配給陣列或打印它們時,我收到了意外的結果=/C程序:打印時的方括號二維字符數組

我最後一次嘗試表明,無論何時將字符分配給陣列,當我打印'['將被打印...這是我第一次實際上能夠打印什麼。我以前的嘗試返回seg故障。這是代碼,我錯過了什麼。謝謝。

typedef struct world_map { 
    char ** map_array; 
    int X, Y; 
} MAP_s; 
// 
MAP_s * map; 

int init_map_array(void) { 
    int i; // temp 
    map = malloc(sizeof (MAP_s)); 
    map->X = 20; // Columns 
    map->Y = 10; // Rows 
    // 
    map->map_array = malloc(map->Y * (sizeof (char *))); 
    // 
    if (map->map_array == 0) { 
     printf("ERROR: out of memory!"); 
     return -1; 
    } else { 
     for (i = 0; i < map->Y; ++i) { 
      map->map_array[i] = malloc(map->X * sizeof (char)); 
      if (map->map_array[i] == 0) { 
       printf("ERROR: out of memory!"); 
       return -1; 
      } 
     } 
    } 
    int curr_pos_x, curr_pos_y; 
    int limit_x = map->X; 
    int limit_y = map->Y; 
    // 
    for (curr_pos_y = 0; curr_pos_y < limit_y; ++curr_pos_y) { 
     for (curr_pos_x = 0; curr_pos_x < limit_x; ++curr_pos_x) { 
      map->map_array[curr_pos_y][curr_pos_x] = "#"; 
     } 
    } 
    return 1; 
} 

int draw_map(void) { 
    int curr_pos_x, curr_pos_y; 
    int limit_x = map->X; 
    int limit_y = map->Y; 
    // 
    for (curr_pos_y = 0; curr_pos_y < limit_y; ++curr_pos_y) { 
     for (curr_pos_x = 0; curr_pos_x < limit_x; ++curr_pos_x) { 
      printf("%c", map->map_array[curr_pos_y][curr_pos_x]); 
     } 
     printf("\n"); 
    } 
} 

int main(void) { 
    init_map_array(); 
    draw_map(); 
    // 
    printf("STRUCT: %i\n", sizeof (map)); 
    printf("X: %i\n", sizeof (map->X)); 
    printf("Y: %i\n", sizeof (map->Y)); 
    printf("ARRAY: %i\n", sizeof (map->map_array)); 
return (EXIT_SUCCESS); 
} 

作爲邊注,在端部4的那些的printf所有返回「4」,我相當肯定,如果一個結構包含3種元素,其各自是4個字節,它應該是大於4個字節本身...

+0

該結構的大小將是12個字節;但是,您正在打印MAP_s *類型的地圖的大小,因此地圖只有4個字節。 – 2010-09-10 08:20:40

回答

1

似乎爲我工作得很好,但有一個錯誤(不知我的GCC是足夠「智能」來處理它,但它仍然是一個錯誤):

map->map_array[curr_pos_y][curr_pos_x] = "#"; 

一個char *(指針分配給字符在數據段)而不是一個字符,當然會導致怪異的字符。將"#"更改爲'#',它應該可以工作。

此外,關於你的printf s的結尾:他們應該是這樣的:

printf("STRUCT*: %lu\n", sizeof (map)); // Prints sizeof(MAP_s *) == sizeof(void *) == 4; 
printf("STRUCT: %lu\n", sizeof (*map)); // Prints sizeof(MAP_s) == 16 on my system (iMac w/ Mac OS X), 
     // alignment and native pointer size might give you different values. 
printf("X: %d\n", map->X); // Prints the X dimension. No sizeof. 
printf("Y: %d\n", map->Y); // Prints the Y dimension. No sizeof. 

不能打印在編譯時map->map_arraysizeof作品的大小,只能返回常數在編譯時已知大小的類型。確定map_array大小的唯一方法是將您在malloc中給出的大小參數保存在變量中。

1

嘗試

map->map_array[curr_pos_y][curr_pos_x] = '#'; 

,而不是

map->map_array[curr_pos_y][curr_pos_x] = "#"; 

map->map_array[curr_pos_y][curr_pos_x]的類型爲char,您正在爲其分配字符串常量。

+1

謝謝,我是個白癡-_- – FrostedPixel 2010-09-10 08:14:11