Tag: 结构

在C中为结构指针数组成员分配地址

一些指针算术有相当大的麻烦。 我想我得到了概念(指针变量指向内存地址,正常变量指向数据)但我相信我的问题是语法( *, &, (*), *(),等) 我想要做的是构建一个自定义结构的动态数组(即指向堆结构的指针数组),我的界面提供了两个方法,“ad_to_obj_array”(它将对象添加,而数组可以为null为空)和“obj_array_dustbin”(它只是处理数组,也处理内容,堆objs)。 前者呈现如下。 对象的细节并不重要(并且结构已经重命名)但是我对一般问题的解决方案如下,如果您能发现错误,我将不胜感激。 编译器抱怨无效的左值,我尝试将RHS上的指针中的地址分配给堆结构指针数组中的指针值: #define NUM_ELEM(x) (sizeof (x) / sizeof (*(x))) obj* add_to_obj_array(obj* new_obj, obj* array) { int number_of_elements = 0; if (array != NULL) { number_of_elements = NUM_ELEM(array); } obj* new_array = NULL; /* note: I am expecting sizeof(new_obj) to return the size of an obj* to go […]

将参数传递给_beginthread() – 什么是错的?

我有这个代码,我没有得到预期的结果……什么是错的? typedef struct { int data1; int data2; }t; void foo(int a, int b) { Handle handle; t arg; arg.data1 = a; arg.data2 = b; handle = (HANDLE) _beginthread( myFunc, 0, (void*) &arg); } void myFunc(void *param) { t *args = (t*) param; int x = args->data1; int y = args->data2; printf(“x=%d, y=%d\n”, x, y); […]

如何在C中自动打印结构值(如gdb ptype)?

这个问题在我脑海里呆了很长时间。 我们知道,我们在调试时可以很容易地在GDB中打印数据结构,就像gdb ptype命令一样,它可以输出结构的所有字段值。 我知道GDB使用bfd库来读取目标文件中的符号信息。 我的问题是:如果我想在我的C源代码中执行此操作,该怎么办? 因为我不想逐个打印每个结构的字段。 是否有任何存在的库来解决这个问题? 我认为该库不仅符合我的要求,在编写C / C ++代码时对许多其他程序员来说非常有用。

C – 在一行中更改结构数组的所有值

我可以声明一个结构: typedef struct { int var1; int var2; int var3; } test_t; 然后使用默认值创建这些结构结构的数组: test_t theTest[2] = { {1,2,3}, {4,5,6} }; 但是在我创建了数组后,有没有办法像上面一样改变值,只使用一行,明确指定每个值而没有循环?

带有数组的C struct的内存布局

假设我有一个C结构定义如下: typedef struct { double array1[2]; } struct0_T; 记忆是如何布局的? struct只能保持一个指针或两个双打的值吗? 在我认为struct有一个指针之前,但今天我发现(令我惊讶的是)值存储在那里。 它在不同的编译器之间有所不同吗?

为什么union *和struct *之间可能存在差异?

C标准要求所有指向union的指针具有相同的表示和对齐要求。 它对struct s的所有指针都强制要求。 因此,我的问题: 为什么标准不强制指向union的指针具有与struct s指针相同的表示和对齐要求? (我非常感谢一个利用这个实现的实现的例子。) 或者我只是错过了相关的文字? 标准草案n1570(C11最终草案)的相关引用: 6.2.5类型§28 指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求。 48)类似地,指向兼容类型的合格或非限定版本的指针应具有相同的表示和对齐要求。 所有指向结构类型的指针都应具有相同的表示和对齐要求。 所有指向union类型的指针都应具有相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。

C中结构中的多个灵活数组?

我在c结构中有多个灵活的数组: typedef struct { int a; float b; } Name; typedef struct { int c; int d; int e; } NIM; typedef struct { int age; int time; Name name[1]; NIM nim[1]; } EthgenSig; 如果我们需要像这样分配内存: malloc(sizeof(EthgenSig) + sizeof(Name) * 10); 如何分配内存,如果我们首先运算符name数组然后我们稍后运行nim数组,那么nim[1]将覆盖name数组,那么如何解决呢?

在C中具有不同定义的相同名称结构

是否允许在同一项目中的2个不同c文件中使用具有不同定义的相同名称结构。 例如。 FILE1.C typedef struct { unsigned int unVar; } abc; file2.c中 typedef struct { int var; } abc; 两个文件中都使用了abc。 当我将这些文件编译为同一项目的一部分时,没有错误,但我想了解这是否正确用法。

C结构点运算符究竟做了什么(低级透视)?

我对C中的结构有疑问。所以当你创建一个结构时,你实际上是在定义一块内存的框架。 因此,当您创建结构的实例时,您正在创建一个内存块,以便它能够容纳一定数量的元素。 但是,我对点运算符正在做什么感到有些困惑。 如果我有一个struct Car并且有一个名为GasMileage的成员(这是一个int成员),我可以通过做类似的事情获得GasMileage的值, int x = CarInstance.GasMileage; 但是,我对这个点运算符实际发生的事情感到困惑。 点运算符是否只是作为基址的偏移量? 它究竟是如何推断它是一个int? 我想我对幕后发生的事情很好奇。 通过做其他事情可以引用GasMileage吗? 如 int *GasMileagePointer = (&carInstance + offsetInBytes(GasMileage)); int x = *GasMileage 这只是我快速弥补的事情。 我一直在努力寻找一个好的解释,但似乎没有什么能比将点运算符视为魔术更能解释它。

这个代码是否由C标准保证?

我已经读过如果你声明这样的两个结构: struct Node { int a, b, c; }; struct DerivedNode { struct Node base; int d, e, f; }; 然后你可以像这样使用指针: struct DerivedNode myDerivedNode; struct Node *regularNode = (struct Node *) &myDerivedNode; regularNode->a = 3; 换句话说, a, b, c的地址偏移在struct Node和struct DerivedNode中是相同的。 因此,您可以从中获得一种多态性,您可以在其中传递强制(struct Node *) cast DerivedNode指针,无论何时通常采用Node指针。 我的问题是这种行为是否得到保证。 我知道有一些奇怪的内存对齐问题,编译器有时会重新排序字段以实现更好的内存打包。 base字段是否会位于struct DerivedNode的开头?