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