我正在尝试创建动态结构的动态数组,但我无法使其正常工作。 它打印所有信息,但它给出了返回错误。 如果我评论包含以下内容的行:
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;
}
答案 0 :(得分:1)
m
的类型应为#34;指向ListSt
&#34;的指针,而不是&#34;指针指向ListSt
&#34;的指针。
您正在为指针数组分配内存:
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]->
取消引用未初始化的指针。
答案 1 :(得分:0)
行。我想我拥有它。 如果某人,也许可以检查一下,那么对可能的错误或未来的问题进行一些评论会很好,或者只是做一些改进。
这是(修改过的)工作代码:
#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.
答案 2 :(得分:0)
我改变了界限:
return *m;
使用:
return m[i];
它按预期工作!
答案 3 :(得分:0)
最终的工作代码,如果它可以帮助某人:
-e