上下文:我需要使用 void*** 创建一个带有 2D 数组的棋盘游戏,在每个插槽中我必须首先放置一个结构“Tierra”,然后在稍后的回合中我可以放置一个结构“Bomba”
二维数组是一个全局变量,我有点东西
这是 Tierra 结构:
typedef struct Tierra{
int vida; // random health (1-3)
int es_tesoro; // 1 or 0 (5% chance of having a treasure)
} Tierra;
这里是创建数组的函数,该函数只能接收维度作为参数,并且必须是void():
void*** tablero;
int dimension;
const int chance[5]={1,2,3,4,5};
void IniciarTablero(int n){
tablero = malloc(n*sizeof(void**));
if(tablero == NULL){
printf("%s", "error con la memoria \n");
exit(1);
}
for( int i=0 ; i<n ; i++){
tablero[i] = malloc(n*sizeof(void*));
if (tablero[i] == NULL){
printf("%s", "error con la memoria \n");
exit(1);
}
for( int j=0 ; j<n ; j++){
Tierra* tierra;
tierra->vida = (rand() % 3) + 1;
int probabilidad = (rand() % 100);
int contenido = 0;
for (int c=0 ; c<5 ; c++){
if(probabilidad==chance[c]){
contenido = 1;
}
}
tierra->es_tesoro = contenido;
tablero[i][j] = tierra;
}
}
}
这是我显示它的函数:
void MostrarTablero(){
for (int i=0 ; i<dimension ; i++){
for (int j=0 ; j<dimension ; j++){
Tierra* imprimir = (Tierra*)tablero[i][j];
printf("%d | ",imprimir->vida);
}
printf("\n");
}
return;
}
每当我尝试在 main 中调用 IniciarTablero() 然后调用 MostrarTablero 时,都会出现分段错误错误,而且它甚至没有进入 MostrarTablero() 。我认为问题可能在于我如何为 tablero[i][j] 赋值,但我是 c 新手,我还不知道如何使用指针。
提前感谢您,希望您度过愉快的一天/一夜。 <3
正如@paddy 所评论的,你不应该使用
void *
作为指针类型
在这种情况下。此外,您不为每个分配内存
struct Tierra
的实体。#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Tierra {
int vida; // random health (1-3)
int es_tesoro; // 1 or 0 (5% chance of having a treasure)
} Tierra;
Tierra ***tablero;
int dimension;
const int chance[5] = {1, 2, 3, 4, 5};
void IniciarTablero(int n)
{
tablero = malloc(n * sizeof(Tierra ***));
for (int i = 0; i < n; i++) {
tablero[i] = malloc(n * sizeof(Tierra **));
for (int j = 0; j < n; j++) {
Tierra *tierra = malloc(sizeof(Tierra)); // missing in the original code
tierra->vida = (rand() % 3) + 1;
int probabilidad = (rand() % 100);
int contenido = 0;
for (int c = 0; c < 5; c++) {
if (probabilidad == chance[c]) {
contenido = 1;
}
}
tierra->es_tesoro = contenido;
tablero[i][j] = tierra;
}
}
}
void MostrarTablero()
{
for (int i = 0; i < dimension; i++) {
for (int j = 0; j < dimension; j++) {
Tierra *imprimir = tablero[i][j];
printf("%d | ", imprimir->vida);
}
printf("\n");
}
}
int main()
{
dimension = 4; // just for example
IniciarTablero(dimension);
MostrarTablero();
// don't forget to free() memory after use
return 0;
}
请注意,仅检查
malloc()
的返回值被省略
为了简单起见,重点关注要点。
顺便说一句,如果值
dimension
是固定的(不是动态分配的),
最好使用简单的 struct Tierra
二维数组。