Tag: struct

在Python CFFI中声明包含time_t字段的struct

我正在使用CFFI从Python调用一个返回结构的C函数。 结构使用time_t元素定义。 如何将结构声明为CFFI,以便我可以从Python访问它? 例如,我尝试了以下(获取文件的修改时间): import cffi ffi = cffi.FFI() ffi.cdef(“”” // From POSIX struct timespec { time_t tv_sec; long tv_nsec; …; }; struct stat { struct timespec st_mtim; …; }; // From “man 2 lstat” int lstat(const char *path, struct stat *buf); “””) stat = ffi.verify(“#include “) 这给出了一个错误: cffi.api.CDefError: cannot parse ” time_t tv_sec;” :5: […]

结构中的枚举; 新手在交流

我想知道在struct中使用enum的语法( 在C ) 我已经看过各种例子,其中使用struct + union / enum组合来创建复杂类型,例如: struct MyStruct{ enum{ TYPE_1, TYPE_2, TYPE_3, } type; union{ int value_1; int value_2; int value_3; } value; }; // … struct MyStruct test_struct; 无论如何,从这个例子中,我如何根据enum字段存储/测试当前的“类型”? 如果我有一个指向test_struct的指针,这似乎不起作用; 踢回未知成员错误: struct MyStruct *test_pointer = &test_struct; test_pointer->value = test_pointer->VALUE_1; 我只是好奇,我需要将enum值作为全局值来访问吗? test_pointer->value = VALUE_1; 任何澄清将不胜感激。

结构中未初始化的字段没有Clang警告

考虑以下结构: typedef struct foo { int a; int b; } foo; 我的编译器没有对以下语句发出警告: foo m = {300} 为什么没有发出警告? 我期待一个警告,因为我没有为结构的最后一个字段提供任何值。 这是我的编译器调用: gcc -Wall -Wpadded -Wuninitialized -g bar.c 这是我的gcc版本: Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) Target: x86_64-apple-darwin15.0.0 Thread model: posix flipped_move字段是否只包含垃圾? 这样安全吗?

代表一个指针

如果ListofChar是一个指向Char的指针(不要与char混淆),它表示struct charact , 那么什么是void report(ListofChar chars) ? chars是否只代表指针ListofChar ? #include #include struct charact { char ch; int occurs; struct charact *next; }; typedef struct charact Char; typedef Char * ListofChar; typedef Char * CharNode_ptr; void letters(char name[50], ListofChar * chars_ptr); void report(ListofChar chars); Char * createnode(char ch); int main() { char name[50]; ListofChar chars = […]

*结构是非法的?

我试图编译以下代码,但编译器不会这样做,因为“*对于结构体来说是非法的”是真的吗? struct String { int length; int capacity; unsigned check; char ptr[0]; } String; void main(){ char *s; String *new_string = malloc(sizeof(String) + 10 + 1); }

如何应用结构偏移?

我有一个结构 typedef struct foo { int lengthOfArray1; int lengthOfArray2; int* array1; int* array2; } foo; 我需要为整个结构及其数组的内容分配足够的内存。 假设每个arrays的长度为5 …… foo* bar = (foo*)malloc(sizeof(foo) + (sizeof(int) * 5) + (sizeof(int) * 5)); 我现在必须将array1和array2指向该分配缓冲区中的正确位置: bar->array1 = (int*)(&bar->lengthOfArray2 + sizeof(int)); bar->array2 = (int*)(bar->array1 + lengthOfArray2); 它是否正确? 编辑#1 只是为了消除任何困惑:我试图将内存保留在一个块中,而不是三个。 编辑#2 我不能使用C99,因为MSVC 2010编译器不支持它(http://stackoverflow.com/questions/6688895/does-microsoft-visual-studio-2010-supports-c99)。

具有多个定义的不透明结构

我正在考虑用C语言实现一个简单的接口模式。 一个关键特性是它将为接口的公共头提供的不透明结构提供多个定义,也就是说,不同的实现将为该结构提供不同的底层数据(因此,跨越不同的转换单元,相同的结构将具有不同的实现)。 我找不到任何参考,这是一个好的或坏的设计模式。 至少它似乎没有违反严格的别名规则,只依赖于公共第一个元素的一致顺序和填充,这是由C标准保证的(据我所知)。 当然我知道C中的面向对象模式,但是我看不到这个特定的模式。 这可以接受吗? 是这样的模式甚至使用? (我找不到任何东西) 为了便于理解,以下是三个源文件的工作示例: reader.h(公共接口定义) #ifndef READER_H #define READER_H typedef struct reader_s reader_t; char reader_read(reader_t* r); #endif reader.c(接口的胶水逻辑) #include “reader.h” typedef char (reader_f)(reader_t*); struct reader_s{ reader_f* rfunc; }; char reader_read(reader_t* r) { return r->rfunc(r); } reader1.h(接口的实现,标题) #ifndef READER1_H #define READER1_H #include “reader.h” reader_t* reader1_get(void); #endif reader1.c(接口的实现,代码) #include “reader1.h” typedef char […]

C指针混乱

我想在内存中存储一​​个字符串并稍后阅读: $$->desc.constant->base.id = (char*)malloc(200); sprintf($$->desc.constant->base.id, “%f”, $1); printf(“->%s\n”, $$->desc.constant->base.id); //LINE A printf(“->%i\n”, $$->desc.constant); //LINE B //SOME OTHER CODE //Then, later on in a function call: printf(“%i”, expr->desc.constant); // LINE D printf(“%s”, expr->desc.constant->base.id); // LINE C 虽然线路B和线路D显示相同的地址,但线路C中的printf失败并出现分段故障。 我错过了什么? 真的很感激任何帮助!

具有灵活数组成员的结构数组如何表现?

正如标题所述,我想知道具有灵活数组成员的C结构数组如何表现。 这是一个例子: struct vector { size_t length; double array[]; }; 维基百科的文章说: 这种结构上的sizeof运算符需要给出灵活数组成员的偏移量。 在我的机器上,这对应于8个字节( sizeof(size_t) )。 但是,当我执行以下操作时会发生什么: 显然,数组不能保存向量v0的数据,因为它只有3 * 8字节= 24字节宽。 我该如何处理这样的情况? #define LENGTH 10 int main() { struct vector arr[3]; struct vector *v0 = calloc(1, sizeof(*v0) + LENGTH * sizeof(v0->array[0])); v0->length = LENGTH; size_t i; for (i = 0; i length; i++) { v0->array[i] = […]

为什么内部结构中不允许使用typedef?

我有一个程序,在现有的typedef结构中定义一个typedef结构,我想知道为什么我得到一个编译错误。 这是程序: typedef struct Outer { typedef struct Inner { int b; }INNER; INNER inner; int a; }OUTER; int main() { OUTER obj; obj.a = 10; obj.inner.b=8; return 0; } 在编译时给出以下错误:: test.c:3:5: error:expected specifier-qualifier-list before ‘typedef’ test.c: In function ‘main’: test.c:17:5: error: ‘OUTER’ has no member named ‘a’ test.c:18:5: error: ‘OUTER’ has no member named […]