有目的地更改我的结构以使用“->”而不是“。”

Purposefully changing my struct to use '->' instead of '.'

通过在 var variables[26]; 中添加额外的 *,我可以避免混淆 .->,并在所有代码中使用相同的运算符 ->。我的同学建议我可能会浪费额外的内存,但它确实让我的编码体验变得顺畅,因为我犯了更少的错误。

这是不好的做法还是可以接受?

原版

#include <stdio.h>

struct var {
   int ** num;
   int y;
   int x;
   int count;
};
typedef struct var var;

struct prog
{
   var variables[26];  <===================================BEFORE CHANGE
};

typedef struct prog prog;

int main()
{
   prog *p = calloc(1,sizeof(prog));
   
   //p->variables[0] = calloc(1, sizeof(var));
   p->variables[0].y=1;   <========================= BEFORE CHANGE, USING '.' to access y


    return 0;
}

更改版本

#include <stdio.h>

struct var {
   int ** num;
   int y;
   int x;
   int count;
};
typedef struct var var;

struct prog
{
   var* variables[26];  <===================================Added * after var
};

typedef struct prog prog;

int main()
{
   prog *p = calloc(1,sizeof(prog));
   
   //p->variables[0] = calloc(1, sizeof(var));
   p->variables[0]->y=1;   <=========================== Now can use '->' instead of '.'


    return 0;
}

prog->你第二个代码中的变量是一个var*的数组。你不能只写 prog->variables[0]->y 因为 variables[0] 还没有分配,你必须对数组内的每个元素调用 malloc 或 calloc。

首先,您在转换时犯了一些错误。但这不是主要问题。

在某些情况下,首选动态分配的指针而不是数组。但我不会说进行切换只是为了能够键入 -> 而不是 . 是一个很好的理由。作为一名 C 程序员,您应该能够同时应对这两种情况。

Is this considered bad practise or acceptable?

如果有人为此特定目的重构代码,我绝不会接受。

var* variables[26]; 为 26 个 pointer-to-var 对象分配内存。它不会为 var 对象本身分配任何内存。照原样,您的第二个示例程序通过尝试取消引用空指针而具有 Undefined Behavior

您需要注释掉的行(可能还有 25 个类似的行)

p->variables[0] = calloc(1, sizeof(var));

因为这是为结构本身分配内存的原因。

对于每个用例,自动内存与动态内存的使用都会发生变化。除非堆栈内存是一个问题,否则在这种情况下你会做更多的工作,并在你的程序中引入更多的故障点。

My classmate suggested that I might be wasting extra memory

您在第二个示例中使用了 26 * sizeof (var *) 个额外的内存字节。

I can avoid mixing . and -> and use the same operator -> in all code.

很多时候您会被迫将两者混合使用,您应该习惯这两种运算符。二者同等重要,充分理解两者,对你大有裨益。


任意反驳论点:为什么不对所有内容使用自动存储和 .

#include <stdio.h>

typedef struct var {
    int **num;
    int y;
    int x;
    int count;
} var;

struct prog {
    var variables[26];
};

typedef struct prog prog;

int main(void)
{
    prog p = { 0 };

    p.variables[0].y = 1;

    for (size_t i = 0; i < 26; i++)
        printf("%d\n", p.variables[i].y);
}

答案又是,有时你可以(这里;忽略 num 结构成员及其预期用途),有时你不能(大分配、复杂分配、外部分配)。