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