【问题标题】:Multidimensional array of INT in CC中INT的多维数组
【发布时间】:2015-02-22 13:45:19
【问题描述】:

我创建了一个简单的程序,它在 c 中使用 INT 的多维数组。

他被设计成一个结构:

typedef struct s_control
{
    int rangees;
    int **rangees_content;
} t_control;

然后,我 malloc 结构等... 但是,当我尝试编辑这样的案例时:

opt->rangees_content[line] = tmp;

其中“tmp”是“int tmp;”声明的int

然后我编译得到:

./main.c:9:30: 警告:赋值使指针从整数 没有演员表 [默认启用] opt->rangees_content[line] = tmp;

有人有想法吗?

谢谢

【问题讨论】:

  • malloc()rangees_content 好吗?并且请定义多维,它只是二维吗?
  • rangees_content[line] 是一个int*。您不能为其分配 int
  • 数组未分配。是的,只有“二维”,抱歉
  • rangees_content[line] 听起来你想分配一整行,所以你应该分配一个 int [],而不是一个 int。
  • 根本无法将数组作为一个整体进行分配。您必须使用循环。

标签: c multidimensional-array struct int


【解决方案1】:

您正在尝试将整数分配给 int 指针,这不应该这样做,它会在尝试取消引用指针时导致未定义的行为。

换句话说,int ** 意味着它可以像二维数组一样被访问,您正在访问其中一个类型为 int * 的维度并尝试为其分配 int

这是一个如何使用int **指针的示例

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

typedef struct s_control
{
    size_t rangees;
    int **rangees_content;
} t_control;

int
main()
{
    t_control control;
    size_t    rowSize;
    /* this is irrelevant to your problem, just initialize the random seed */
    srand(time(NULL));
    /* Initialize the struct members */
    control.rangees         = 10;
    control.rangees_content = malloc(control.rangees * sizeof(int *));
    /*                                                        ^ 
     * Above, you allocate 'control.rangees' pointers of 'int'
     */
    if (control.rangees_content == NULL)
        return -1;
    rowSize = 10; /* this value can be changed */
    for (size_t i = 0 ; i < control.rangees ; ++i)
    {
        /* this is the i-th row of the array and has type 'int *', malloc it */
        control.rangees_content[i] = malloc(rowSize * sizeof(int));
        if (control.rangees_content[i] == NULL)
        {
            /* always handle malloc failure */
            while (i >= 0)
                free(control.rangees_content[i--]);
            free(control.rangees_content);

            return -1;
        }
        /* Iterate through the array elements, and assign random values to them */
        for (size_t j = 0 ; j < rowSize ; ++j)
            control.rangees_content[i][j] = rand() % 100;
    }
    /* print and free the array */
    for (size_t i = 0 ; i < control.rangees ; ++i)
    {
        for (size_t j = 0 ; j < rowSize ; ++j)
            printf("%5d", control.rangees_content[i][j]);
        printf("\n");
        free(control.rangees_content[i]);
    }
    free(control.rangees_content);
    return 0;
}

上面的程序,生成随机数并用它们填充数组,然后输出到stdout

【讨论】:

  • 需要注意的是,如图创建的数组是一个“scattered”数组。它不是由连续的内存块表示,而是由1 + rowSize 单独的块表示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2013-03-21
  • 2014-06-20
  • 2016-12-07
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多