我正在尝试创建一个动态结构数组,但我无法使它正常工作。它打印所有信息,但给出返回错误。如果我评论包含以下内容的行:
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;
}发布于 2018-06-15 14:18:40
最后的工作代码,如果它可以帮助某人:
#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;
}发布于 2018-06-14 21:22:03
m应该是“指向ListSt的指针”,而不是“指向ListSt的指针”。m = (ListSt **)malloc(sizeof(int*)*max_fil);
..。但是数组中的元素仍未初始化。
顺便说一句,那应该是
sizeof (ListSt *) * (sizeof (sizes) / sizeof (* sizes))
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
size of an element number of elements in array "sizes"m[0]的值,但从未将值分配给m[0]。这被称为未定义的行为;此时,程序可以自由地做它想做的任何事情,例如,由于分段错误而崩溃。
更具体地说,您说的是m[i]->values =,但是m[i]是一个未初始化的变量,所以m[i]->取消引用一个未初始化的指针。发布于 2018-06-14 22:41:12
好的。我想我有了。如果有人,请,也许,可以检查,这将是很好的评论,可能的错误或未来的问题,或只是一些改进。
下面是(修改后的)工作代码:
#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;
}印出来:
-----------
Element n.0 :
m[0][0] id: [0] val: 0.000100
m[0][1] id: [0] val: 0.000200
m[0][2] id: [0] val: 0.000300
m[0][3] id: [0] val: 0.000400
-----------
Element n.1 :
m[1][0] id: [1] val: 0.000200
m[1][1] id: [1] val: 0.000400
m[1][2] id: [1] val: 0.000600
m[1][3] id: [1] val: 0.000800
m[1][4] id: [1] val: 0.001000
m[1][5] id: [1] val: 0.001200
-----------
Element n.2 :
m[2][0] id: [2] val: 0.000300
m[2][1] id: [2] val: 0.000600
m[2][2] id: [2] val: 0.000900
m[2][3] id: [2] val: 0.001200
m[2][4] id: [2] val: 0.001500
m[2][5] id: [2] val: 0.001800
m[2][6] id: [2] val: 0.002100
m[2][7] id: [2] val: 0.002400
-----------
Element n.3 :
m[3][0] id: [3] val: 0.000400
m[3][1] id: [3] val: 0.000800
m[3][2] id: [3] val: 0.001200
m[3][3] id: [3] val: 0.001600
m[3][4] id: [3] val: 0.002000
m[3][5] id: [3] val: 0.002400
m[3][6] id: [3] val: 0.002800
m[3][7] id: [3] val: 0.003200
m[3][8] id: [3] val: 0.003600
m[3][9] id: [3] val: 0.004000
Process returned 0 (0x0) execution time : 0.106 s
Press any key to continue.https://stackoverflow.com/questions/50865970
复制相似问题