C 动态结构体的动态数组

标签 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;
}

最佳答案

  1. m 类型应为“指向 ListSt 的指针”,而不是“指向 ListSt 的指针”。

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

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

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

    顺便说一句,应该是这样

    sizeof(ListSt *)*(sizeof(尺寸)/sizeof(*尺寸))
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
    元素的大小数组“sizes”中元素的数量

  3. 然后您继续使用 m[0] 的值,但是您从未为 m[0]< 赋值。这称为未定义行为;此时,程序可以自由地做任何它想做的事,例如因段错误而崩溃。

    更具体地说,你说m[i]->values =,但m[i]是一个未初始化的变量,所以m[i]-> 取消引用未初始化的指针。

关于C 动态结构体的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865970/

相关文章:

C - 字符串的最佳实践

c++ - libcurl在windows上的静态库

c++ - 如何将 C 函数指针迁移到 C++?

c++ - 为什么打印单向链表时有一个虚拟节点?

c - 将字符串附加到动态字符数组的函数的 ACSL 规范

c - 存储字符串数组并循环直到文件末尾

c - 从 "Address of a function"开始的字节中有什么?如何知道要考虑多少字节?

C 程序因大型数组而崩溃

c - 如何在一行中增加或减少 C 函数调用中的指针参数值?

c - 创建动态通用数组时,realloc 出现段错误