C动态结构的动态数组

时间:2018-06-14 21:08:20

标签: c pointers dynamic-arrays

我正在尝试创建动态结构的动态数组,但我无法使其正常工作。 它打印所有信息,但它给出了返回错误。 如果我评论包含以下内容的行:

printf(" m[%i][%i] ID: %i VALUE: %f\n", i, j, m[i]->id, m[i]->values[j]);

编译好并返回0。 我究竟做错了什么? 我刚刚开始学习C并处理指针。

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

typedef struct listDef{
   int id;
   float *values;
} ListSt;


int main()
{
    int max_fil, fil, col;
    max_fil = 4; /* Max 'ListSt' elements*/
    fil=2; /* Rows  */
    col=4; /* Columns */
    ListSt **m = NULL;
    int count = 0;
    int sizes[] = {4,6,8,10}; /* The sizes of each 4 elements to be created */
    m = (ListSt **)malloc(sizeof(int*)*max_fil); /* Assign a memory address for accesing 'm' (ListSt) */
    for(int i=0;i<fil;i++){
        m[i]->values = (float *)malloc(sizeof(float)*sizes[i]);
        m[i]->id = i;
        printf("-----------\n");
        printf("Element n.%i :\n\n", i);
        for(int j=0;j<sizes[i];j++){
            m[i]->values[j] = 0.1234*(i+1);
            /* If I comment the next line, it compiles OK. */
            printf(" m[%i][%i] ID: %i VALUE: %f\n", i, j, m[i]->id, m[i]->values[j]);

            int testint;
            float testfloat;
            testint = m[i]->id;
            testfloat = m[i]->values[j];
        }
    }

    free(m);
    return 0;
}

4 个答案:

答案 0 :(得分:1)

  1. m的类型应为#34;指向ListSt&#34;的指针,而不是&#34;指针指向ListSt&#34;的指针。

  2. 您正在为指针数组分配内存:

    m = (ListSt **)malloc(sizeof(int*)*max_fil);

    ...但是数组保持未初始化的元素。

    顺便说一下,那应该是

    sizeof (ListSt *) * (sizeof (sizes) / sizeof (* sizes))
    ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    size of an element number of elements in array "sizes"

  3. 然后继续使用m[0]的值,但您从未为 m[0]分配值。这称为未定义的行为;在这一点上,程序可以随意做任何事情,例如崩溃与分段错误。

    更具体地说,您说m[i]->values =,但m[i]是未初始化的变量,因此m[i]->取消引用未初始化的指针。

答案 1 :(得分:0)

行。我想我拥有它。 如果某人,也许可以检查一下,那么对可能的错误或未来的问题进行一些评论会很好,或者只是做一些改进。

这是(修改过的)工作代码:

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

typedef struct listDef{
   int id;
   float *values;
} ListSt;


int main()
{
    int max_fil, fil, col;
    max_fil = 4; /* Max 'ListSt' elements*/
    fil=4; /* Elements  */
    ListSt *m = NULL;
    int count = 0;
    int sizes[] = {4,6,8,10,12,13}; /* The sizes of each 4 elements to be created */
    m = (ListSt *)malloc(sizeof (ListSt) * fil); /* Assign a memory address for accesing 'm' (ListSt) */

    for(int i=0;i<fil;i++){
        m[i].values = (float *)malloc(sizeof(float)*sizes[i]);
        printf("-----------\n");
        printf("Element n.%i :\n\n", i);
        for(int j=0;j<sizes[i];j++){
            m[i].id = i;
            m[i].values[j] = 0.0001*(i+1)*(j+1);
            printf(" m[%i][%i] id: [%i] val: %f\n", i, j, m[i].id, m[i].values[j]);
        }
    }

    free(m);
    return 0;
}

它打印出来:

-----------
Element n.0 :

 m[0][0] id: [0] val: 0.000100
 m[0][1] id: [0] val: 0.000200
 m[0][2] id: [0] val: 0.000300
 m[0][3] id: [0] val: 0.000400
-----------
Element n.1 :

 m[1][0] id: [1] val: 0.000200
 m[1][1] id: [1] val: 0.000400
 m[1][2] id: [1] val: 0.000600
 m[1][3] id: [1] val: 0.000800
 m[1][4] id: [1] val: 0.001000
 m[1][5] id: [1] val: 0.001200
-----------
Element n.2 :

 m[2][0] id: [2] val: 0.000300
 m[2][1] id: [2] val: 0.000600
 m[2][2] id: [2] val: 0.000900
 m[2][3] id: [2] val: 0.001200
 m[2][4] id: [2] val: 0.001500
 m[2][5] id: [2] val: 0.001800
 m[2][6] id: [2] val: 0.002100
 m[2][7] id: [2] val: 0.002400
-----------
Element n.3 :

 m[3][0] id: [3] val: 0.000400
 m[3][1] id: [3] val: 0.000800
 m[3][2] id: [3] val: 0.001200
 m[3][3] id: [3] val: 0.001600
 m[3][4] id: [3] val: 0.002000
 m[3][5] id: [3] val: 0.002400
 m[3][6] id: [3] val: 0.002800
 m[3][7] id: [3] val: 0.003200
 m[3][8] id: [3] val: 0.003600
 m[3][9] id: [3] val: 0.004000

Process returned 0 (0x0)   execution time : 0.106 s
Press any key to continue.

答案 2 :(得分:0)

我改变了界限:

return *m;

使用:

return m[i];

它按预期工作!

答案 3 :(得分:0)

最终的工作代码,如果它可以帮助某人:

-e