gpt4 book ai didi

C、不用malloc初始化struct

转载 作者:行者123 更新时间:2023-12-04 05:35:17 24 4
gpt4 key购买 nike

我会避免使用 malloc 来初始化结构,并且我正在寻找使用 oo 样式(在可能的情况下)设计 C 软件的最佳实践。

只有 C99,没有 C++

第一个问题,当使用像对象这样的结构时,什么更可取? typedef 它的指针与否?

这些是我的测试(所有工作都使用 gcc 编译器):

案例 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct sItem{
int n;
char* text;
} oItem, *Item;

int main(int argc, char** argv) {
Item i1=(&(oItem){.n=1, .text="A"});
Item i2=(&(oItem){.n=100, .text="ABC"});
printf("%d, %s, %d\n", i1->n, i1->text, sizeof(*i1)); // 1, "A", 8
printf("%d, %s, %d\n", i2->n, i2->text, sizeof(*i2)); // 1, "ABC", 8
return (EXIT_SUCCESS);
}

这有效,但我认为不应该,因为文本未初始化为包含字符串。
这是一段无效的代码吗?

案例 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct sItem{
int n;
char text[5];
} oItem, *Item;

int main(int argc, char** argv) {
Item i1=(&(oItem){.n=1, .text="A"});
Item i2=(&(oItem){.n=100, .text="ABC"});
printf("%d, %s, %d\n", i1->n, i1->text, sizeof(*i1)); // 1, "A", 12
printf("%d, %s, %d\n", i2->n, i2->text, sizeof(*i2)); // 1, "ABC", 12
return (EXIT_SUCCESS);
}

这有效,我认为它是正确的,是吗?

案例 3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Item_new(i, n, s) (&(oItem){0});Item_ctor(i, n, s);
#define Item_neww(i, x, s) (&(oItem){\
.n=x,\
.text=s\
})

typedef struct sItem{
int n;
char text[5];
} oItem, *Item;


void Item_ctor(Item i, int n, char* text){
i->n=n;
strcpy(i->text, text);
}

int main(int argc, char** argv) {
Item i1=Item_new(i1, 10, "ABC");
Item i2=Item_neww(i2, 10, "ABC");
printf("%d, %s, %d\n", i1->n, i1->text, sizeof(*i1)); // 10, "ABC", 12
printf("%d, %s, %d\n", i2->n, i2->text, sizeof(*i2)); // 10, "ABC", 12
return (EXIT_SUCCESS);
}

我觉得这很好,但是隐藏了代码,而且可能有害,你怎么看?
I case 3,什么是最好的选择:宏还是构造函数?

最佳答案

3、包含未 protected 宏;不要做让我特别紧张。

相反,我会用以下内容替换您的“new”和“ctor”

#define Item_new(i, n, s) Item_ctor(&(oItem){0}, n, s)

Item Item_ctor(Item i, int n, char* text){
if (i) {
i->n=n;
strncpy(i->text, text, 4);
}
return i;
}

这并没有打破用户对 Item_new 的期望: 一个真实的
函数类似于返回值的宏。

ctor 应该做必要的检查并且永远不要覆盖内存, i->text[4]将永远是 0 . (更好的是使用符号常量而不是 5 并将其也用于 strncpy 调用。)

关于C、不用malloc初始化struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030625/

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