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