如何将内存分配给C中指针引用的变量



如何将内存分配给C中指针引用的变量?

这个代码对我来说不正确。malloc之后,pBitmap为0x600020"。我只能分配第一个字符,但在尝试分配更多字符时,它会崩溃,所以很明显内存分配不正确。

int bmp_read_file(char * filename, BMPFILE *bmpfile, ...)
{
  int num; bool loadbitmap;  char ** pBitmap;
  // this code is kinda shorten
  va_list ap;
  va_start(ap, num);
  loadbitmap = va_arg(ap, bool);
  pBitmap = va_arg(ap, char ** );
  va_end(ap);
  if (loadbitmap == 1){
      *pBitmap = (char *) malloc( bmpfile->dib.raster_size );
      // pBitmap is 0x600020 ""
      *pBitmap[0]='1';
      *pBitmap[1]='4'; // pBitmap is 0x600020 "1"
      fclose(fp);
  }
  else
    fclose(fp);
  return 0;
}

我这样称呼它:

  BMPFILE *bmpfile;
  bool loadbitmap = true;
  char * buffer; // bitmap buffer needed to be allocated
  bmp_read_file(argv[1],&bmpfile,loadbitmap,&buffer);

更改:

  *pBitmap[0]='1';
  *pBitmap[1]='4'; // pBitmap is 0x600020 "1"

收件人:

  (*pBitmap)[0]='1';
  (*pBitmap)[1]='4'; // pBitmap is 0x600020 "1"

现在,您的代码正在执行相当于*(pBitmap[0]) = '1'的操作,考虑到您分配*pBitmap的方式,这没有任何意义。

您可以将指针用作pointer[1],也可以将其用作*(pointer + 1)来访问索引为1的元素。当然,任何其他索引都应该替换1。除非您有一个指针数组,否则*pointer[1]将不起作用。

在一条评论中,您问:

可变数量的自变量有什么问题?

如果不使用可变数量的参数,函数可以简化很多。

int bmp_read_file(char * filename,
                  BMPFILE *bmpfile,
                  bool loadbitmap,
                  char** pBitmap);
{
   if (loadbitmap == 1)
   {
      *pBitmap = malloc( bmpfile->dib.raster_size );
      (*pBitmap)[0]='1';
      (*pBitmap)[1]='4';
   }
   // fclose(fp); 
   // Not sure why you have that in your function. There is no
   // variable fp and there is no call to fopen().
   return 0;
}

更新

再仔细考虑一下,就可以完全删除loadbitmap参数。

int bmp_read_file(char * filename,
                  BMPFILE *bmpfile,
                  char** pBitmap);
{
   if (pBitmap != NULL)
   {
      *pBitmap = malloc( bmpfile->dib.raster_size );
      (*pBitmap)[0]='1';
      (*pBitmap)[1]='4';
   }
   return 0;
}

当你不需要标题信息时,你可以简单地使用:

BMPFILE *bmpfile;
bmp_read_file(argv[1],&bmpfile,NULL);

相关内容

  • 没有找到相关文章

最新更新