Arrays 将数组作为元素放置到C中的另一个数组中

Arrays 将数组作为元素放置到C中的另一个数组中,arrays,c,Arrays,C,我是C语言的新手,我很难掌握制作数组的概念 我创建了第一个2d数组,通过初始化最大可能的条目来获取输入 int max; scanf("%d", &max); int(*first)[n] = malloc(sizeof(int[n][n])); 在对输入进行编码之后,由于每个输入都有不同的长度,因此每个输入的第一个[I]都有不同的未使用空间。我收到超过内存限制的消息,因此我想删除未使用的空间。因此,我创建了第二个数组,并计划只复制第一个数组中使用的空格,但我无法初

我是C语言的新手,我很难掌握制作数组的概念

我创建了第一个2d数组,通过初始化最大可能的条目来获取输入

int max;
scanf("%d", &max);
int(*first)[n] = malloc(sizeof(int[n][n]));
在对输入进行编码之后,由于每个输入都有不同的长度,因此每个输入的第一个[I]都有不同的未使用空间。我收到超过内存限制的消息,因此我想删除未使用的空间。因此,我创建了第二个数组,并计划只复制第一个数组中使用的空格,但我无法初始化第二个数组

int second[n];
for (int i = 0; i < n; i++)
{
     int len = length of first[i];
     int length[len];
     second[i] = length;
}
int秒[n];
对于(int i=0;i
当您有一个2D数组,但不知道每个元素的大小时,请创建一个指针数组。然后为每个元素分配所需的内存

一个简单的例子是存储文件的每一行。每一行都是一个字符数组,但您不知道一行可以有多长。分配一个足以容纳尽可能大的线的2D阵列将是巨大的浪费。而是分配一个
char**
。这将是
char*
字符串的列表

const int max_lines = 1024;
char **lines = malloc(sizeof(char*) * max_lines);
这是1024个指针。每个指针只有4或8个字节。所以只有大约8k的内存。这里也有避免分配固定大小的方法,但这是另一个答案

然后阅读每一行,只存储每一行所需的数据

int i = 0;
char line[BUFSIZ];
while( fgets(line, sizeof(line), stdin) ) {
  lines[i] = strdup(line);
  i++;
}

使用分配,以使其足够大以适合大多数任何行。我们重复使用它来读取文件的行。但是,我们不存储所有额外的内存,而是将该行复制到最小内存,并将指向该行的指针存储在
行中

当您有一个2D数组,并且不知道每个元素的大小时,创建一个指针数组。然后为每个元素分配所需的内存

一个简单的例子是存储文件的每一行。每一行都是一个字符数组,但您不知道一行可以有多长。分配一个足以容纳尽可能大的线的2D阵列将是巨大的浪费。而是分配一个
char**
。这将是
char*
字符串的列表

const int max_lines = 1024;
char **lines = malloc(sizeof(char*) * max_lines);
这是1024个指针。每个指针只有4或8个字节。所以只有大约8k的内存。这里也有避免分配固定大小的方法,但这是另一个答案

然后阅读每一行,只存储每一行所需的数据

int i = 0;
char line[BUFSIZ];
while( fgets(line, sizeof(line), stdin) ) {
  lines[i] = strdup(line);
  i++;
}

使用分配,以使其足够大以适合大多数任何行。我们重复使用它来读取文件的行。但是,我们不存储所有额外的内存,而是将该行复制到最小内存,并将指向该行的指针存储在
行中

有专门的数据结构针对这些情况进行了优化,例如,但根据您的知识水平,它们可能有点难以实现

一个简单的解决方案(以分割内存为代价)是使用每行的第一个元素作为指示该行将拥有的列数的哨兵,为了简洁起见,我省略了错误检查:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand((unsigned)time(NULL));

    size_t rows = (size_t)(rand() % 10 + 10);
    int **array = malloc(sizeof *array * rows);

    for (size_t row = 0; row < rows; row++)
    {
        int cols = rand() % 10 + 1;

        array[row] = malloc(sizeof **array * (size_t)(cols + 1));
        array[row][0] = cols;
        for (int col = 1; col < cols + 1; col++)
        {
            array[row][col] = rand() % 10;
        }
    }
    for (size_t row = 0; row < rows; row++)
    {
        int cols = array[row][0];

        printf("%d cols: ", cols);
        for (int col = 1; col < cols + 1; col++)
        {
            printf("%d ", array[row][col]);
        }
        printf("\n");
        free(array[row]);
    }
    free(array);
    return 0;
}

有专门的数据结构针对这些情况进行了优化,例如,但是根据您的知识水平,它们可能有点难以实现

一个简单的解决方案(以分割内存为代价)是使用每行的第一个元素作为指示该行将拥有的列数的哨兵,为了简洁起见,我省略了错误检查:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    srand((unsigned)time(NULL));

    size_t rows = (size_t)(rand() % 10 + 10);
    int **array = malloc(sizeof *array * rows);

    for (size_t row = 0; row < rows; row++)
    {
        int cols = rand() % 10 + 1;

        array[row] = malloc(sizeof **array * (size_t)(cols + 1));
        array[row][0] = cols;
        for (int col = 1; col < cols + 1; col++)
        {
            array[row][col] = rand() % 10;
        }
    }
    for (size_t row = 0; row < rows; row++)
    {
        int cols = array[row][0];

        printf("%d cols: ", cols);
        for (int col = 1; col < cols + 1; col++)
        {
            printf("%d ", array[row][col]);
        }
        printf("\n");
        free(array[row]);
    }
    free(array);
    return 0;
}