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