我在使用malloc()
时遇到问题。基本上我想存储来自位图的像素信息(假设RGB 0-255
- 尽管将其存储在fgetc()
的int中,因此我们仍然可以获得EOF
指示符。我想要它动态存储,因为我需要在将特定位发送到输出之前更改它。我不知道为什么这个代码失败了,但它只是挂在while循环中或者以值-1
退出(可能是一个seg错误)。
int** outputbytes = (int **) malloc(writablesize*sizeof(char));
if (outputbytes == NULL)
printf("mallocfailed");
int i = 0;
while(i < writablesize)
{
int cbmp = fgetc(fbmp);
if(cbmp == EOF)
break;
outputbytes[i] = (int *) malloc(sizeof(char));
*outputbytes[i] = cbmp;
i++;
}
编辑:在逻辑上只是一个错误,并且在大小方面实现了malloc()。这是工作代码感谢帮助
// Copy bmpdata to to dynamic memory
long* outputbytes = malloc(writablesize*sizeof(long));
if (outputbytes == NULL) exit(1); // Terminate if allocation fails
int opbi = 0; // Index for the output bytes
while(opbi < writablesize)
{
int cbmp = fgetc(fbmp);
outputbytes[opbi] = (long) cbmp;
opbi++;
}
答案 0 :(得分:1)
int** outputbytes = (int **) malloc(writablesize*sizeof(char)); //sizeof(char ) ??
这不正确(没有足够的内存来容纳 int *
)。
您需要为int *
的号码分配内存,但您需要为char
的号码分配内存。这样做 -
int** outputbytes = malloc(writablesize*sizeof(int *));
现在为writablesize
个int *
分配内存,然后在while
循环中分配内存 -
outputbytes[i] = (char *)malloc(sizeof(char)); //allocating memory -sizeof(char) ??
分配等于sizeof(int)
的内存来保存整数,因为它是int *
。
outputbytes[i] = malloc(sizeof(int));
注意 - 请勿投射malloc
的结果。还记得free
已分配内存。
答案 1 :(得分:0)
您在代码中为变量outputbytes分配了两次内存。您可以为outputbytes变量分配一次内存。
然后您使用(sizeof(char))为整数变量分配内存。因此,您将收到分段错误错误。
然后,您将变量outputbytes声明为指针指针。但是你试图将该变量作为指向数组的指针来访问。
所以你可以修改你的代码,如下所示。
int** outputbytes = (int **) malloc(writablesize*sizeof(int));
if (outputbytes == NULL)
printf("mallocfailed");
int i = 0;
while(i < writablesize)
{
int cbmp = fgetc(fbmp);
if(cbmp == EOF)
break;
*(outputbytes+i) = cbmp; //Accessing pointer to a pointer
i++;
}
答案 2 :(得分:0)
您不应该使用某种碎片查找表来存储位图,它们需要存储在相邻的存储单元中。因此,您需要重写整个代码,以便它使用一个malloc。
您可以使用malloc分配一个大块字节,也可以使用它来分配一个struct项数组,在这种情况下,您必须确保结构中没有不需要的填充。
通常,位图是通过位图标题分配的,其中“灵活数组成员”中的最后一项又与位图数据相对应。
无论如何,你真正需要做的是获取/创建一个头文件来定义所使用的位图格式,然后从那里获取它。