我正在尝试创建动态结构的动态数组,但无法使其正常工作。 它打印所有信息,但给出返回错误。 如果我评论包含以下内容的行:
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;
}
最佳答案
m
类型应为“指向ListSt
的指针”,而不是“指向ListSt
的指针”。您正在为指针数组分配内存:
m = (ListSt **)malloc(sizeof(int*)*max_fil);
...但数组中的元素仍未初始化。
顺便说一句,应该是这样
sizeof(ListSt *)*(sizeof(尺寸)/sizeof(*尺寸))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
元素的大小数组“sizes”中元素的数量
然后您继续使用
m[0]
的值,但是您从未为m[0]< 赋值
。这称为未定义行为;此时,程序可以自由地做任何它想做的事,例如因段错误而崩溃。更具体地说,你说
m[i]->values =
,但m[i]
是一个未初始化的变量,所以m[i]->
取消引用未初始化的指针。
关于C 动态结构体的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865970/