C动态结构的动态数组

C动态结构的动态数组,c,pointers,dynamic-arrays,C,Pointers,Dynamic Arrays,我正在尝试创建动态结构的动态数组,但无法使其正常工作。 它打印所有信息,但返回错误。 如果我对包含以下内容的行进行注释: printf(" m[%i][%i] ID: %i VALUE: %f\n", i, j, m[i]->id, m[i]->values[j]); 它编译OK并返回0。 我做错了什么? 我刚刚开始学习C语言,正在处理指针 #include <stdio.h> #include <stdlib.h> typedef struct list

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

printf(" m[%i][%i] ID: %i VALUE: %f\n", i, j, m[i]->id, m[i]->values[j]);
它编译OK并返回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;
}
#包括
#包括
类型定义结构列表定义{
int-id;
浮动*值;
}利斯特;
int main()
{
国际最高法院,最高法院,最高法院;
max_fil=4;/*max'ListSt'元素*/
fil=2;/*行*/
col=4;/*列*/
ListSt**m=NULL;
整数计数=0;
int size[]={4,6,8,10};/*要创建的每4个元素的大小*/
m=(ListSt**)malloc(sizeof(int*)*max_fil);/*为访问“m”(ListSt)分配一个内存地址*/
对于(int i=0;ivalues=(float*)malloc(sizeof(float)*size[i]);
m[i]>id=i;
printf(“------------\n”);
printf(“元素n.%i:\n\n”,i);
对于(int j=0;jj值[j]=0.1234*(i+1);
/*如果我注释下一行,它编译为OK*/
printf(“m[%i][%i]ID:%i值:%f\n”,i,j,m[i]->ID,m[i]->values[j]);
智力测验;
浮动测试浮动;
testint=m[i]>id;
testfloat=m[i]>值[j];
}
}
自由(m);
返回0;
}
  • m
    应为“指向
    ListSt
    ”类型,而不是“指向
    ListSt
    ”类型

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

    m=(ListSt**)malloc(sizeof(int*)*max\u fil);

    …但数组中的元素仍未初始化

    顺便说一下,应该是这样的

    sizeof(ListSt*)*(sizeof(size)/sizeof(*size))

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    元素大小数组中的元素数“大小”

  • 然后继续使用
    m[0]
    的值,但从未为
    m[0]
    赋值。这称为未定义行为;此时,程序可以随意执行任何操作,例如因分段错误而崩溃

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

  • 好的,我想我拿到了。 如果有人,请,也许可以检查它,这将是伟大的,有一些关于可能的错误或未来的问题,或只是一些改进意见

    以下是(修改后的)工作代码:

    #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;
    }
    

    我改变了路线:

    return*m;

    与:

    返回m[i];


    它的工作原理与预期一样!

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

    #include <stdio.h>
    #include <stdlib.h>
    
    int max_fil, count;
    typedef struct listDef{
       float *values;
       int id;
       int nElements;
    
    } ListSt;
    
    
    
    ListSt ListSt_init(ListSt *m, int i, int s){
        m[i].values = (float *)malloc(sizeof(float)*s);
        printf("-----------\n");
        printf("CREATE Element n.%i :\n\n", i);
        for(int j=0;j<s;j++){
            m[i].id = i;
            m[i].nElements = s;
            m[i].values[j] = 0.0000 + count*(0.1);
            printf("m[%i][%i]  ID: %i  TotalElements: %i  Value[%i]: %f\n", i, j, m[i].id, m[i].nElements, j, m[i].values[j]);
            count++;
        }
    
        return m[i];
    }
    
    
    int main()
    {
        max_fil = 100; /* Max 'ListSt' elements addresses to be created */
        count = 0; /* Just a global counter for each 'values' */
        int sizes[] = {4,8,4}; /* The sizes of each 4 elements to be created */
        ListSt *m = NULL;
        m = (ListSt *)malloc(sizeof (ListSt) * max_fil); /* Assign a memory address for accesing 'm' (ListSt) */
    
        /* Lets create three lists */
        m[0] = ListSt_init(m, 0, sizes[0]);
        m[1] = ListSt_init(m, 1, sizes[1]);
        m[2] = ListSt_init(m, 2, sizes[2]);
    
        printf("\n-----------\n");
        printf("PRINT RESULT :\n");
        printf("-----------\n\n");
        /* Now we show the elements.... */
        for(int i=0;i<3;i++){
            printf("RESULT Element n.%i :\n\n", i);
            for(int j=0;j<sizes[i];j++){
                printf("m[%i][%i]  ID: %i  TotalElements: %i  Value[%i]: %f\n", i, j, m[i].id, m[i].nElements, j, m[i].values[j]);
            }
        }
        free(m);
        return 0;
    }
    
    #包括
    #包括
    int max_fil,计数;
    类型定义结构列表定义{
    浮动*值;
    int-id;
    内部元素;
    }利斯特;
    ListSt ListSt_init(ListSt*m,int i,int s){
    m[i]。值=(浮点*)malloc(sizeof(浮点)*s);
    printf(“------------\n”);
    printf(“创建元素n.%i:\n\n”,i);
    
    对于(int j=0;jCan您能告诉我们您收到了什么错误吗?它会挂起几秒钟,然后显示:进程返回-1073741819(0xC0000005)执行时间:3.371s按任意键继续。
    m=(ListSt**)malloc(sizeof(int*)*max_fil);
    这看起来可疑。但即使我为它保存printf行:printf(“m[%I][%I]\n”,I,j);它也会给出错误。“然后你继续使用m[0]的值,但是*你从来没有给m[0]赋值。”那么我如何给m[0]结构赋值呢?我想通过:m[0]->id=1;m[0]->values[0]=0.1 m[0]->values[1]来赋值=0.1…等等不要只是解释他做错了什么,还要展示如何纠正它。是的,如果有人能解释如何让它起作用那就太好了:).我对此感到困惑,我刚刚开始学习C,我需要知道如何做到这一点…从尝试到出错,阅读并运行了许多示例,已经很多天了,但没有运气尝试发现…这更好。您应该将分配给
    m[I].id
    for(j)之外
    loop;提示:在
    m[i].id=i
    中没有
    j
    ,那么它为什么要进入一个由
    j
    索引的循环中呢?另外,如果练习是释放所有分配的内存,你也应该释放
    m[i]。值
    ;在现实生活中,你当然必须将每个
    m[i]中的元素数存储在某个地方.values
    。是的,Alex,你是对的。但在本例中,
    m.id
    充当LisSt对象的标识符号。你认为你能帮我完成我发布的示例吗?我正试图从函数初始化列表,但它会覆盖值…谢谢AlexP!
    #include <stdio.h>
    #include <stdlib.h>
    
    int max_fil, count;
    typedef struct listDef{
       float *values;
       int id;
       int nElements;
    
    } ListSt;
    
    
    
    ListSt ListSt_init(ListSt *m, int i, int s){
        m[i].values = (float *)malloc(sizeof(float)*s);
        printf("-----------\n");
        printf("CREATE Element n.%i :\n\n", i);
        for(int j=0;j<s;j++){
            m[i].id = i;
            m[i].nElements = s;
            m[i].values[j] = 0.0000 + count*(0.1);
            printf("m[%i][%i]  ID: %i  TotalElements: %i  Value[%i]: %f\n", i, j, m[i].id, m[i].nElements, j, m[i].values[j]);
            count++;
        }
    
        return m[i];
    }
    
    
    int main()
    {
        max_fil = 100; /* Max 'ListSt' elements addresses to be created */
        count = 0; /* Just a global counter for each 'values' */
        int sizes[] = {4,8,4}; /* The sizes of each 4 elements to be created */
        ListSt *m = NULL;
        m = (ListSt *)malloc(sizeof (ListSt) * max_fil); /* Assign a memory address for accesing 'm' (ListSt) */
    
        /* Lets create three lists */
        m[0] = ListSt_init(m, 0, sizes[0]);
        m[1] = ListSt_init(m, 1, sizes[1]);
        m[2] = ListSt_init(m, 2, sizes[2]);
    
        printf("\n-----------\n");
        printf("PRINT RESULT :\n");
        printf("-----------\n\n");
        /* Now we show the elements.... */
        for(int i=0;i<3;i++){
            printf("RESULT Element n.%i :\n\n", i);
            for(int j=0;j<sizes[i];j++){
                printf("m[%i][%i]  ID: %i  TotalElements: %i  Value[%i]: %f\n", i, j, m[i].id, m[i].nElements, j, m[i].values[j]);
            }
        }
        free(m);
        return 0;
    }