2

我想制作一个大小未知的数组,这样制作是真的吗?:

int *array,var,i=0;
FILE *fp;
fopen=("/home/inputFile.txt","r");
fscanf(fp,"%d",&var);
while(fp!=NULL)
{
    if(var>0)
   {
        array=malloc(sizeof(int));
        array[i++]=var
   }
   fscanf(fp,"%d",&var);
}
4

3 回答 3

1

sizeof(int) 将返回 4 (并请注意,很少有编译器/设置可能会告诉您 2 或 8 作为响应)。所以你的代码相当于分配一个 4 字节长的数组。

如果您想要一个大小未知的数组,则值得在 std::vector 之类的 STL 容器上抢购一下(因为它将在后台管理分配和调整大小)。如果您打算坚持使用“普通 C”范围,您可能会对 TSTL2CL 库感兴趣:http: //sourceforge.net/projects/tstl2cl

于 2013-09-13T10:06:52.100 回答
1

基本的事情是,ARRAY 是静态的而不是动态的。

于 2013-09-13T10:07:49.497 回答
1

这是荒谬的错误,充满了内存泄漏和未定义的行为。

然而,它离正确的方式之一并不远链表方式:

struct linked_int
{
    int value;
    struct linked_int* pNext;
};

struct linked_int *pHead=NULL;
struct linked_int **ppTail = &pHead;
int* array = NULL;
int cpt=0;
/*Read file, building linked list*/
FILE *fp = fopen("/home/inputFile.txt","r");
if(fp != NULL)
{
    int var;
    while(fscanf(fp,"%d",&var)==1)
    {
        if(var>0)
        {
            struct linked_int *pNew = malloc(sizeof(struct linked_int));
            pNew->value = var;
            pNew->pNext = NULL;
            /*Append at the tail of the list*/
            *ppTail = pNew;
            ppTail = &(pNew->pNext);

            cpt++;
        }
    }
    fclose(fp);
}

/*Copy from the linked list to an array*/
array = malloc(sizeof(int) * cpt);
if(array != NULL)
{
    int i;
    struct linked_int const *pCur = pHead;
    for(i=0 ; i<cpt ; i++)
    {
        arr[i] = pCur->value;
        pCur = pCur->pNext;
    }
}

/*Free the linked list*/
while(pHead != NULL)
{
    struct linked_int *pDelete = pHead;
    pHead = pHead->pNext;
    free(pDelete);
}
ppTail = &pHead;

其他方法:

另一个正确的方法是realloc方法,它包括重新分配具有不断扩大的大小的数组(通常是几何增长,即每次将数组大小乘以一个数字,例如 1.5)。这样做的错误方法是每次将数组大小加 1。

它是这样的:

int arrayCapacity=0, numberOfItems=0;
int* array = NULL;
int var;
while(fscanf(fp, "%d", &var)==1)
{
    if(numberOfItems >= arrayCapacity)
    {
        /*Need to resize array before inserting*/
        const int MIN_CAPACITY = 4;
        const double GROWTH_RATE = 1.5;
        int newCapacity = arrayCapacity<MIN_CAPACITY ? MIN_CAPACITY : (int)(arrayCapacity*GROWTH_RATE);
        int* tmp = realloc(array, newCapacity*sizeof(int));
        if(tmp==NULL)
        {
            /*FAIL: can't make the array bigger!*/
        }
        else
        {
            /*Successfully resized the array.*/
            array = tmp;
            arrayCapacity = newCapacity;
        }
    }

    if(numberOfItems >= arrayCapacity)
    {
        puts("Cannot add, array is full and can't be enlarged.");
        break;
    }
    else
    {
        array[numberOfItems] = var;
        numberOfItems++;
    }
}
/*Now we have our array with all integers in it*/

显而易见的结果是,在这段代码中,数组中可能存在未使用的空间。这不是问题。

于 2013-09-13T10:08:49.937 回答