gpt4 book ai didi

c - 有目的地更改我的结构以使用 '->' 而不是 '.'

转载 作者:行者123 更新时间:2023-12-02 16:01:17 25 4
gpt4 key购买 nike

通过在 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;
}

最佳答案

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 结构成员及其预期用途),有时你不能(大量分配、复杂分配、外部分配)。

关于c - 有目的地更改我的结构以使用 '->' 而不是 '.',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70613250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com