[英]Struct manipulation needs some explanation
我有以下代码:
//length, width, height
typedef struct {
float L, W, H;
} TDim;
//contains details for each geometrical form
typedef struct {
char *id; // each geometrical form has a unique id
float volume;
TDim *dim;
} TForm;
TForm* FormAlloc()
{
TForm *F = (TForm*) malloc(MAX * sizeof(TForm));
F->id = (char*) malloc(MAX * sizeof(char));
F->dim = (TDim*) malloc(MAX * sizeof(TDim));
return F;
}
这是在更多结构中操纵变量和指针的好方法。
我想做的是存储ID(基本上是字母'F',后跟1,2,3 ...),一些长方体的长度,宽度和高度,以便计算其体积。
我需要有关->
vs用法的一些解释.
我了解->
适用于地址和.
与成员。
在int main()
,我有:
F[0].id = "F1"; //the first cuboid has the id "F1"
F[0].dim[0].L = 1; //the first cuboid has length = 11
//could have used F[0].dim->L = 1; as well?
F[0].dim[0].W = 2;
F[0].dim[0].H = 3;
F[1].id = "F2"; //the second cuboid has the id "F2"
F[1].dim[1].L = 4; //this is where it breaks down - SEG_FAULT (I've used gdb to catch it)
是什么导致该行中的SEG_FAULT?
在此功能中:
TForm* FormAlloc()
{
TForm *F = (TForm*) malloc(MAX * sizeof(TForm));
F->id = (char*) malloc(MAX * sizeof(char));
F->dim = (TDim*) malloc(MAX * sizeof(TDim));
return F;
}
您创建了一个由TForm
的MAX
元素组成的动态数组,但随后只为第一个的id
和dim
成员分配了内存,因此当您尝试在第二个元素中存储内存时会出现段错误。
您将需要以下内容:
TForm* FormAlloc(void)
{
TForm *F = malloc(MAX * sizeof(TForm));
if ( !F ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
for ( size_t i = 0; i < MAX; ++i ) {
if ( (F[i].id = malloc(MAX)) == NULL ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
if ( (F[i].dim = malloc(MAX * sizeof(TDim))) == NULL ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
}
return F;
}
最有可能的是,您不想在所有这三个目的上都使用MAX
,也就是说,您需要与每个id
字符串中的字符完全相同数量的TForm
元素的TForm
很低。
其他更多次要点:
malloc()
可以返回NULL
,您应该检查一下。
在您问题的代码中, F[0].id = "F1";
应该是strcpy(F[0].id, "F1");
或类似的方法,因为否则您将丢失对malloc()
编辑内存的引用。
您不需要,也确实应该在C中将malloc()
的返回值转换为C。
sizeof(char)
根据定义始终为1
,因此您可以将其省略。
对于您评论中的问题:
F[0].dim[0].L = 1;
vsF[0].dim->L = 1;
?
这两个是等效的。 使用下标运算符dim[0]
自动为您解除对dim
的引用,因此您可以使用.
运算符获取元素( dim[n]
等效于C中的*(dim + n)
)。 没有[0]
, dim
是直指针,因此您将使用->
运算符。 显然,当您要访问数组中的其他元素时,第一种形式更方便。 对于其他,您必须替换F[0].dim[1].L = 1;
其中(F[0].dim + 1)->L = 1;
或类似的方法来使用->
运算符,该运算符是不必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.