有目的地更改我的结构以使用“->”而不是“。”
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
结构成员及其预期用途),有时你不能(大分配、复杂分配、外部分配)。
通过在 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
结构成员及其预期用途),有时你不能(大分配、复杂分配、外部分配)。