繁体   English   中英

结构操作需要一些解释

[英]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;
}

您创建了一个由TFormMAX元素组成的动态数组,但随后只为第一个的iddim成员分配了内存,因此当您尝试在第二个元素中存储内存时会出现段错误。

您将需要以下内容:

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很低。

其他更多次要点:

  1. malloc()可以返回NULL ,您应该检查一下。

  2. 在您问题的代码中, F[0].id = "F1"; 应该是strcpy(F[0].id, "F1"); 或类似的方法,因为否则您将丢失对malloc()编辑内存的引用。

  3. 您不需要,也确实应该在C中将malloc()的返回值转换为C。

  4. sizeof(char)根据定义始终为1 ,因此您可以将其省略。

对于您评论中的问题:

F[0].dim[0].L = 1; vs F[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM