【问题标题】:Create Dynamic Array in c在 c 中创建动态数组
【发布时间】:2016-01-21 18:01:24
【问题描述】:

我正在尝试创建一个大小为 32 的动态数组,然后从某个文件中读取整数,并将它们存储在数组中。当数组被填满时,然后将其大小加倍(创建另一个两倍大小的数组,将元素从旧数组复制到它并释放旧数组)直到输入文件用完。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#define limit 32

int main (int argc, char *argv[]) {

    FILE *file = fopen ("myFile1.txt", "r");
    int i = 0, num;
    int *B, *C;

    B = malloc (sizeof (int) * limit);

    while (fscanf (file, "%d", &num) > 0) {
        if (i < limit) {
            B[i] = num;
            i++;
        }
        else {
            C = malloc (sizeof (int) * 2 * limit);
            memcpy (C, B, limit * sizeof (int));
            free (B);

            B = C;
            B[i] = num;
            i++;
            limit = limt * 2;
            i++;
        }
    }
    return 0;
}

我收到如下错误:“lvalue required as left operand of assignment”和第二个错误:“segmentation fault”。

因此,我正在尝试探索与动态数组相关的新可能性,以增加我的知识;通过修改代码来帮助我。

我们将不胜感激。

【问题讨论】:

  • 请修正格式,您的限制变量似乎丢失了。
  • @Bruce 他使用预处理器命令#define 来“定义”限制
  • 您可以使用realloc(): limit = limit * 2; B = realloc(B, limit*sizeof(int)); 调整数组大小并复制其数据。无需创建名为 C 的临时数组。
  • 将数组增加到两倍大小可能有点贪心 - 将它增加一个固定数量怎么样 - 比如说 32 或 1000 任何合适的。
  • 您需要将limit 设为变量,而不是宏。

标签: c arrays dynamic


【解决方案1】:

您实际上可以使用 realloc() 为您的数组分配更多内存:

void *realloc(void *ptr, size_t size)

而不是那样做:

  {
    C=malloc(sizeof(int)*2*limit);
    memcpy(C,B,limit*sizeof(int));
    free(B);
    B=C;
    B[i]=num;
            i++;
            limit=limt*2;
    i++;
       }

你可以简单地做:

B = realloc(B,new_size_in_bytes);

谈谈你的代码:

预处理器命令#define 将在编译之前将每次出现的单词“limit”替换为与其关联的值(在本例中为 32)。所以你不能在运行时真正改变宏的值。如果您希望这样做,我的建议是不要定义限制,而是使用变量。 关于段错误,我没有。确保将名为“myFile1.txt”的文件放在 .c 文件所在的同一文件夹中,同时检查是否拼写错误。

【讨论】:

  • @Trisha 我对 C++ 的经验很少,但我可以向你保证 realloc 是在 C 中调整数组大小的正确方法。
  • 好吧,这也是一个不错的选择,但我使用的方法不正确。需要建议。
  • 它也很棒。但我也只想实现它..这就是为什么要问。
  • 你在阅读部好像不是很强(你没有注意到指出的错别字),而且你似乎还没有对realloc进行自己的研究。跨度>
  • @WeatherVane 我正在编辑帖子,对不起。顺便说一句,我还在学习 malloc() 和 realloc(),但我认为我明白了它们的意思。你注意到了什么问题?作为学生,我们将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2021-06-26
  • 2013-12-16
  • 2011-06-09
  • 2020-05-20
  • 2018-05-19
  • 1970-01-01
相关资源
最近更新 更多