gpt4 book ai didi

C 动态结构体的动态数组

转载 作者:行者123 更新时间:2023-11-30 14:47:57 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com