【发布时间】:2011-04-10 15:05:02
【问题描述】:
我遇到了一个令人困惑的问题 - 至少对我来说,这可能非常简单而且我遗漏了一些东西。我正在尝试初始化一个可变大小的二维数组,该数组是结构的一部分。我在为数组分配内存时没有问题,但是当我尝试将字符分配给数组或打印它们时,我收到了意外的结果 =/
我的最后一次尝试表明,无论我何时将字符分配给数组,当我打印一个 '[' 时都会打印...这是我第一次真正能够打印 anything。我之前的尝试返回了段错误。这是代码,我错过了什么。谢谢。
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 个字节...
【问题讨论】:
-
结构体的大小为 12 字节;但是,您打印的是 MAP_s * 类型的地图大小,因此地图只有 4 个字节。
标签: c multidimensional-array malloc printf