Tag: 结构

什么是零宽度位域

可能重复: 零长度位域的实际应用 为什么有些结构具有零宽度位域,为什么需要它? struct foo { int a:3; int b:2; int :0; // Force alignment to next boundary. int c:4; int d:3; }; int main() { int i = 0xFFFF; struct foo *f = (struct foo *)&i; printf(“a=%d\nb=%d\nc=%d\nd=%d\n”, f->a, f->b, f->c, f->d); return 0; } 上述程序的输出是 manav@os-team:~/programs/test$ ./a.out a=-1 b=-1 c=-8 d=0 请解释为什么这些值是负数,以及结构内部这些变量的内存布局?

双重对齐

根据这篇文章的讨论,我理解结构成员对齐的主要原因是性能(以及一些架构限制)。 如果我们将在编译32位x86时调查Microsoft(Visual C ++),Borland / CodeGear(C ++ – Builder),Digital Mars(DMC)和GNU(GCC): int的对齐是4个字节,如果int未对齐,可能会发生2行存储体的读取。 我的问题是为什么不将double设为4字节对齐呢? 4字节对齐double也会导致2行内存库读取…. 例如,在下面的示例中,由于double是8对齐的,因此结构的实际大小将是sizeof(char) + (alignment for double padding) + sizeof(int) = 20 bytes 。 typedef struct structc_tag{ char c; double d; int s; } structc_t; 谢谢

C在结构中初始化数组

我想在结构中包含一个可变长度数组,但是无法正确初始化它。 struct Grid { int rows; int cols; int grid[]; } int main() { struct Grid testgrid = {1, 3, {4, 5, 6}}; } 我尝试的一切都给了我一个’错误:灵活数组成员的非静态初始化’错误。

struct {0}和memset 0 之间有什么区别

可能重复: 使用哪一个 – memset()或值初始化将结构清零? 假设我们有这样的结构: struct A { int x; int y; }; 有什么区别 A a = {0}; 和 A a; memset(&a,0,sizeof(A));

GCC:数组类型具有不完整的元素类型

我已经声明了一个结构,我尝试将这些结构的数组(以及双数组和一个整数)传递给一个函数。 当我编译它时,我从gcc得到一个“数组类型具有不完整的元素类型”消息。 我如何将结构传递给函数我有什么问题? typedef struct graph_node { int X; int Y; int active; } g_node; void print_graph(g_node graph_node[], double weight[][], int nodes); 我也试过了struct g_node graph_node[] ,但我得到了同样的东西。

结构数组替换自身的值

好的,所以我有下面的代码,我只是从文件中提取各种东西,并在结构数组中输入它们,它“看似”最初工作,但是当我完成文件后,我打印它似乎已经用最后一个谷替换了所有的课程和名称,奇怪的是这不会发生整数(成绩),成绩确实得到了正确的输入。 #include #include #include struct student { char *name; char *course; int grade; }; void courseSort(struct student d[20], int size); int main(void) { FILE* fp; char* filename = “grades.csv”; char buffer[100]; char* name, *class; char* del=”,”; int grade, i, counter=0; struct student d[20]; if((fp=fopen(filename, “r”))==NULL) { printf(“unable to open %s\n”, filename); exit(1); } while(fgets(buffer, sizeof(buffer), […]

GCC的__attribute __((__ packed__))是否保留原始排序?

目的 我正在用C编写一个网络程序(特别是gnu89 ),我想通过将某个struct X重新解释为大字节数组(也就是char ),通过网络发送字节,并将它们重新解释为struct X来简化事情。另一边。 为此我决定使用gcc的__attribute __((__ packed__))。 我已尽力确保正确完成(即我已经考虑了字节序和其他相关问题)。 题 除了保证struct X尽可能小,gcc是否保证使用__attribute __((__ packed__))定义的struct保留原始排序? 我已经做了相当多的搜索,我还没有找到关于这种保证是否存在的任何文件。 笔记 可以安全地假设发送方和接收方都不会遇到可移植性问题(例如服务器上的sizeof(int)等于客户端上的sizeof(int) )。

为什么在C中释放struct还有数据?

当我运行此代码时: #include typedef struct _Food { char name [128]; } Food; int main (int argc, char **argv) { Food *food; food = (Food*) malloc (sizeof (Food)); snprintf (food->name, 128, “%s”, “Corn”); free (food); printf (“%d\n”, sizeof *food); printf (“%s\n”, food->name); } 我还是得到了 128 Corn 虽然我已经解放了食物。 为什么是这样? 记忆真的被释放了吗?

传递2D数组结构

我从数组中处理卡片类型结构。 struct card deck[DECKSIZE]; //The deck is an array of cards structures 我正在使用2Darrays。 一组卡片类型结构的数组 struct card allHands[hands][cards]; 我使用此函数将deck和数组作为指针传递给数组的参数。 我还改变了甲板指针的位置,以模拟在传递给玩家时丢失牌的牌组。 void dealHands(struct card *deck, struct card **handArray, int hands, int cards){ int players; int cardCount; int passCard = 0; struct card * thisDeck; thisDeck = deck; for(players = 0; players < hands; players++){ for(cardCount = 0; […]

零长度数组

最近我遇到了一个结构定义, struct arr { int cnt; struct { int size; int *name; } list[0]; }; 现在我不知道list[0]被宣布的原因。 我感兴趣的是为什么使用它。 它有什么优势吗? 如果是,那是什么?