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

时间:2015-02-13 20:57:29

标签: c pointers malloc

如何将内存分配给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);

3 个答案:

答案 0 :(得分:1)

变化:

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

要:

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

现在,您的代码相当于*(pBitmap[0]) = '1',这对您分配*pBitmap的方式没有任何意义。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在评论中,你问:

  

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

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

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);