我想把数组从一个函数(SDL_Surface)扩展到另一个函数(load_level)。我不得不说initialize_ballsSDL_Surface)是一个动态指针结构,它通过brickim函数在load_level函数内部定义,并声明为malloc。当我试图在SDL_Surface **brickim函数中访问brickim[0]->w而不是在initialize_balls函数中访问load_level时,出现了分段错误。这是我希望你能帮我修复的代码。
文件1.c

#include <stdio.h>
#include <SDL.h>
SDL_Surface **brickim; /*as global*/
SDL_Surface* load_map(char *map_name , int tran );

void load_level(int stage){
int n;
SDL_Surface **brickim=( SDL_Surface **)malloc(sizeof(SDL_Surface)*input.N);
    for (n=0;n < input.N;n++){
        **brickim[n]=load_map("brick1.bmp",1); /*load SDL_Surfaces*/**
        printf("%d\n",brickim[n]->w);  /***access succesfully (returns 100 N times)***/
        }
...
}}
SDL_Surface* load_map(char *map_name , int tran ){
SDL_Surface *temp,*map;
Uint32 colorkey;
        printf("Loading bit map %s %d...\n",map_name,tran);
        temp = SDL_LoadBMP(map_name);
        if (temp == NULL){
                printf("Unable to load bitmap: %s\n", SDL_GetError());
                SDL_FreeSurface(temp);
                exit(0);
        }else{
                map = SDL_DisplayFormat(temp);
                colorkey = SDL_MapRGB( map -> format, 132, 0, 12);
                if ( tran==1 ) SDL_SetColorKey( map, SDL_SRCCOLORKEY, colorkey );
                SDL_FreeSurface(temp);
        }
                return map;
 }

文件2.c
#include <SDL.h>
#include <stdlib.h>
#include <stdio.h>

extern SDL_Surface **brickim;/*brings brickim to this function*/

void initialize_balls()
{
      printf("Into initialization :)\n ");
    printf("%d \n",brickim[0]->w); /***returns segmentation fault***/
}

$./kuranes
Loading bit map brick1.bmp 1...
level image:) 100 (x10 times)
Into initialization :)
Violación de segmento (`core' generado)

当我使用用gcc编译的单个SDL_Surface时,一切运行正常,但我需要动态地执行它。我认为缺少了一些非常基本的东西。

最佳答案

你的问题似乎就在这里。你宣布一个全球金砖四国,这将是外部声明所发现的。然后,在加载级别中,声明一个局部brickim变量。您可以在不同的作用域中声明具有相同名称的变量,但全局brickim不会在加载级别中使用,而本地brickim将在加载级别中使用。因此,当您在本地brickim中执行malloc时,您永远不会分配到全局brickim中—因此,如果您通过extern访问它,它将为空,并且您将segfault。

SDL_Surface **brickim; /*as global*/
SDL_Surface* load_map(char *map_name , int tran );

void load_level(int stage){
int n;
SDL_Surface **brickim=( SDL_Surface **)malloc(sizeof(SDL_Surface)*input.N);
    for (n=0;n < input.N;n++){
        **brickim[n]=load_map("brick1.bmp",1); /*load SDL_Surfaces*/**
        printf("%d\n",brickim[n]->w);  /***access succesfully (returns 100 N times)***/
        }
...
}}

编辑:一般来说,您可能需要检查整个分配。我不熟悉SDL_Surface结构,但我假设它不是指针类型(它是泛型结构)。您的分配实际上是分配N个结构,但是您的强制转换就好像是分配N个指向SDL_表面结构的指针一样。不要投马洛克。
如果需要N个SDL_曲面结构,只需要:
SDL_Surface * brickim = malloc(sizeof(SDL_Surface) * N)

如果需要N个指向SDL_曲面结构的指针,则需要:
SDL_Surface ** brickim = malloc(sizeof(SDL_Surface *) * N)
for( i = 0; i < N; i++){
   // you've only allocated an array of pointers so far, you now need
   // allocate N structures
   brickim[0] = malloc(sizeof(SDL_Surface));
}

关于c - 如何在C中外部SDL_Surface数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30826457/

10-10 06:14