如何使用新的 C++ 创建动态数组?

How to create a dynamic array using new C++?

我正在尝试动态初始化一个整数数组,因为数组的大小会根据输入而变化。 程序如下:

int main()
{
    int* list = createList("dis.bin");
    for (int i = 0; i < sizeof(list) / sizeof(int); i++)
    {
        printf("%d\n", list[i]);
    }
}

createList()函数写成:

int* createList(const char* file_name)
{
    int counter = 1;
    int* inst{};
    FILE* myFile = fopen(file_name, "rb");
    if (myFile == nullptr)
    {
        printf("\nFile not opened\n");
        return 0;
    }

    int x = 0;
    for (int i = 0; !(feof(myFile)); i++)
    {
        fread(&x, sizeof(int), 1, myFile);
        inst = new int[counter];
        inst[i] = x;
        printf("%08x #%-4d |   Int equiv: %-12d |   Bin equiv: %s\n", x, counter, inst[i], ToBinary(inst[i], 0));
        counter += 1;
        x = 0;
    }

    return inst;
}

createList.bin 文件(基本上包含一个字节数组)中读取并将每对 4 个字节插入数组 inst 中的一个项目。为此,我根据 counter 变量为数组分配新数量的 space。 (因此,无论值计数器是什么,都会成为 inst = new int[counter] 数组的大小)然后我将给定索引 i 处的数组内容设置为等于 x(读取的字节对)我会假设它至少在 createList 中工作正常,因为 printf 语句在 inst[].

中打印每个元素

然而,当我在 main 中调用 createList("dis.bin") 并将其分配给变量 int* list 时,我尝试遍历每个值。但这只是打印出一个未初始化的值(-842150451,如果您好奇的话)。所以我不确定我在这里做错了什么?

我应该提一下,我没有使用矢量或任何标准容器。我只是在使用数组。出于特定原因,我也在使用 printf

这里有两件事:

  1. new的用法被我误解了。无论出于何种原因,我认为每次为 inst 分配新内存时,它只是将新内存附加到已分配的内存中,但显然不是这样。如果我想模拟这个,我必须在每次迭代后复制数组的内容并将其添加到新分配的内存中。为了解决这个问题,我等到文件迭代完成后才为 inst 分配内存。

  2. 正如 Andy 所指出的,sizeof(list) / sizeof(int) 不会给我 list 中的元素数量,因为它是一个指针。为了解决这个问题,我为 createList() 函数创建了一个新参数 int &read 以传递创建的项目数。

有了这些要点,新函数看起来像这样并按预期工作:

int* createList(const char* file_name, int &read)
{
    int counter = 1;
    FILE* myFile = fopen(file_name, "rb");
    if (myFile == nullptr)
    {
        printf("\nFile not opened\n");
        return 0;
    }

    int x = 0;
    for (int i = 0; !(feof(myFile)); i++)
    {
        fread(&x, sizeof(int), 1, myFile);
        printf("%08x #%-4d |   Int equiv: %-12d |   Bin equiv: %s\n", x, counter, x, ToBinary(x, 0));
        counter += 1;
    }

    int* inst = new int[counter];
    read = counter;
    rewind(myFile); // rewind to beginning of file

    for (int i = 0; !(feof(myFile)); i++)
    {
        fread(&x, sizeof(int), 1, myFile);
        inst[i] = x;
        x = 0;
    }
    
    return inst;
}

main 也发生了一些变化:

int main()
{
    int read;
    int* list = createList("dis.bin", read);
    for (int i = 0; i < read; i++)
    {
        printf("%d\n", list[i]);
    }
}

至于!(feof(myFile))无效的评论,虽然有帮助,但这不是我问题的一部分,因此我不关心。但为了传播重要信息,我将寻找解决方案: Why is "while ( !feof(file) )" always wrong?

这个问题被标记为 C++,但 OP 正在显示 C 代码并说他们需要在 C 中使用它,所以我将在 C 中显示它...但前提条件是它使用 new而不是 malloc

int* createList(const char* file_name, int& count)
{
    // initialize count, so that way if we return early, we don't have invalid information
    count = 0;

    // open the file ad "READ" and "BINARY"
    FILE* myFile = fopen(file_name, "rb");
    if (!myFile)
    {
        printf("\nFile not opened\n");
        return 0;
    }

    // calculate how many 4-byte integers exist in the file using
    // the file length
    fseek(myFile, 0, SEEK_END);
    count = ftell(myFile) / sizeof(int);
    rewind(myFile);
    
    // allocate the memory
    int* returnData = new int[count];

    // read in 4-byte chunks to our array until it can't read anymore
    int i = 0;
    while (fread(&returnData[i++], sizeof(int), 1, myFile) == 1);

    // close the file
    fclose(myFile);

    // return our newly allocated data
    return returnData;
}

int main()
{
    int count;
    int* myInts = createList("c:\users\andy\desktop\dis.bin", count);
    for (int i = 0; i < count; ++i) {
        printf("%d\n", myInts[i]);
    }
    // don't forget to delete your data. (another reason a vector would be better suited... no one remembers to delete :)
    delete myInts;
}