c - 如何在 C 中外部 SDL_Surface 数组?

标签 c arrays linux sdl

我想将一个 SDL_Surface 数组从一个函数 (load_level) 外部到另一个函数 (initialize_balls)。我不得不说 SDL_Surface (brickim) 是一个动态指针结构,它是通过 malloc< 在 load_level 函数内部定义的 函数并声明为 SDL_Surface **brickim。当我尝试在 initialize_balls 函数中而不是在 load_level 函数中访问 brickim[0]->w 时出现段错误。这是一段代码,希望您能帮助我修复。

文件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,这将是 extern 声明找到的内容。然后,您在 load_level 中声明一个 local brickim 变量。您可以在不同的范围内声明一个具有相同名称的变量,但是全局的 brickim 不会在 load_level 中使用,局部的会。因此,当您对 local brickim 执行 malloc 时,您永远不会分配到全局 brickim - 因此如果您通过 extern 访问它,它将为 NULL 并且您将发生段错误。

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_Surface 结构。不要使用 malloc。

如果你想要N个SDL_Surface结构,你只需要有:

SDL_Surface * brickim = malloc(sizeof(SDL_Surface) * N)

如果你想要 N 个指向 SDL_Surface 结构的指针,你需要:

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/

相关文章:

c - PeekNamedPipe 总是为 totalBytesAvailable 返回 0

c - scanf 的异常行为

c - Raspberry pi 上的 Libusb 问题

arrays - 如何将列表转换为 R 中的数组?

c - openSSL 读/写线程安全

c++ - FPU,SSE 单 float 。哪个更快?低于或高于

java - 如何获取一个字符串,将所述字符串转换为二进制,然后获取每个 1 或 0 并将其作为值添加到数组中

java - Java 如何计算文件的哈希值?

linux - 如何协调两个linux进程以两步锁步计划运行?

linux - 使用 awk 或 sed 在文件的第一列中添加增量日期