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

How allocate memory to variable referenced by pointer in 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);

您可以将指针用作 pointer[1] 或将其用作 *(pointer + 1) 以访问索引为 1 的元素。当然,对于任何其他索引,替换 1。 除非你有一个指针数组 *pointer[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.

的方式,这没有任何意义

在评论中,您提出了以下问题:

what's wrong with variable number of arguments?

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

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