我有一个令人困惑的问题 - 至少对我来说,这可能是非常简单而我错过了一些东西。我正在尝试初始化一个可变大小的2D数组,该数组是结构的一部分。我没有为数组分配内存的问题但是当我尝试将字符分配给数组,或者打印它们时我收到了意想不到的结果= /
我的最后一次尝试表明,无论何时我分配给数组,当我打印'['将被打印...这是我第一次真正能够打印任何东西。我以前的尝试返回了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”,我很确定如果一个struct包含3个元素,每个4个字节,它应该大于4个字节本身... < / p>
答案 0 :(得分: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 :(得分:1)
似乎对我来说工作正常,但有一个错误(不知何故,我的GCC“智能”足以处理它但它仍然是一个错误):
map->map_array[curr_pos_y][curr_pos_x] = "#";
指定char *
(指向数据段中的字符的指针)而不是char,这当然会导致奇怪的字符。将"#"
更改为'#'
,它应该有效。
此外,关于最后的printf
:它们应该如下所示:
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_array
的大小,因为sizeof
在编译时工作,并且只能返回编译时已知大小的类型的常量。确定map_array
大小的唯一方法是在变量中保存您对malloc
的大小参数。