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

如何将内存分配给C中指针引用的变量?,c,pointers,malloc,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

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

您可以将指针用作
指针[1]
或将其用作
*(指针+1)
来访问索引为1的元素。当然,对于任何其他索引,请替换1。 除非您有一组指针
*否则指针[1]
将无法工作。

更改:

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


现在,您的代码相当于
*(pBitmap[0])='1'
,考虑到您分配
*pBitmap

的方式,这没有任何意义。您在评论中问道:

参数数量可变有什么问题

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

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

“123”远远不是字符,甚至不是字符串……您可能需要使用
strcpy
和双引号括起来的字符串literalsAs@EugeneSh。说,这甚至没有编译。什么是
*pBitmap[0]='123'应该怎么做?复制字符串
“123”
?指定一个数值字符
123
?但主要是,你为什么要用数量可变的函数参数使事情复杂化?它是在没有警告的情况下编译的吗?@Weather Vane:数量可变的参数有什么问题吗?我问的是如何分配内存,而不是如何访问元素是的,但就我所知,你的内存分配是正确的。现在不可能进行测试。好吧,考虑到pBitmap是指针数组(例如
*argv[]
),这可能是有意义的。请注意,代码被缩短了。我之所以选择可变参数数,是因为在我只想读取文件头而不想读取位图的情况下,当您不需要读取文件头时,我不需要创建
bool loadbitmap,char**pBitmap
所需的变量,只需将
0
NULL
传递给函数即可。
BMPFILE *bmpfile;
bmp_read_file(argv[1],&bmpfile,NULL);