如何正确使用malloc()来存储许多整数值?

时间:2015-10-23 03:39:13

标签: c eclipse

我在使用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++;
}

3 个答案:

答案 0 :(得分:1)

int** outputbytes = (int **) malloc(writablesize*sizeof(char));   //sizeof(char ) ??

这不正确(没有足够的内存来容纳 int *)。

您需要为int *的号码分配内存,但您需要为char的号码分配内存。这样做 -

int** outputbytes = malloc(writablesize*sizeof(int *));

现在为writablesizeint *分配内存,然后在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项数组,在这种情况下,您必须确保结构中没有不需要的填充。

通常,位图是通过位图标题分配的,其中“灵活数组成员”中的最后一项又与位图数据相对应。

无论如何,你真正需要做的是获取/创建一个头文件来定义所使用的位图格式,然后从那里获取它。