Tag: struct

sizeof(struct)对于不同的编译器是不同的

假设我有这样的代码: #include #include int main(int argc, char *argv[]) { typedef struct{ uint16_t x : 9; uint8_t y : 7; } z; printf(“sizeof(z) = %lu\n”,sizeof(z)); } 我对Mac上的clang有不同的结果(2)并且有人在Windows上告诉我它返回(3)。 我不确定我是否理解它,但我看到,当第一个编译器将结构压缩为9 + 7 = 16位时,另一个使用16位uint16_t和8位uint8_t。 你能告诉我吗?

创建包含字符串的静态C结构

我正在尝试在Rust中创建一个动态库,它导出一个结构作为符号,将通过dlopen()加载到C程序中。 但是,当我访问结构中的第二个字符串时,我遇到了一些段错误,所以我做了一个小测试程序,试着弄清楚我做错了什么。 这是Rust代码(test.rs),使用“rustc –crate-type dylib test.rs”编译: #[repr(C)] pub struct PluginDesc { name: &’static str, version: &’static str, description: &’static str } #[no_mangle] pub static PLUGIN_DESC: PluginDesc = PluginDesc { name: “Test Plugin\0”, version: “1.0\0”, description: “Test Rust Plugin\0” }; 这是尝试加载库(test.c)的C程序,使用“gcc test.c -ldl -o test”编译: #include #include typedef struct { const char *name; const char *version; […]

为Array of Structs动态分配内存

这是我正在尝试做的事情: #include #include struct myStruct { int myVar; } struct myStruct myBigList = null; void defineMyList(struct myStruct *myArray) { myStruct *myArray = malloc(10 * sizeof(myStruct)); *myArray[0] = ’42’; } int main() { defineMyList(&myBigList); } 我正在写一个简单的C程序来完成这个。 我正在使用GNU99 Xcode 5.0.1编译器。 我已经阅读了很多例子,编译器似乎不同意在哪里使用struct标签。 在sizeof()命令中使用struct引用似乎根本不识别struct 。

如何在C中初始化指向结构的指针?

鉴于此结构: struct PipeShm { int init; int flag; sem_t *mutex; char * ptr1; char * ptr2; int status1; int status2; int semaphoreFlag; }; 这工作正常: static struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 […]

struct中的可变长度数组

我正在用C语言编写应用程序(作为初学者),我正在努力在包含可变长度数组的结构中获取损坏的数据。 我发现在cprogramming.com上的论坛post以及cert.og / secure-coding中描述了类似的问题。 我以为我找到了正确的解决方案,但似乎没有。 结构看起来像这样; typedef struct { int a; int b; } pair; typedef struct { CommandType name; pair class; pair instr; pair p1; pair p2; pair p3; CommandType expected_next; char* desc; int size; pair sw1; pair sw2; pair* data; } command; 有问题的是“命令”。 对于“命令”的任何给定实例(或任何正确的短语),将设置不同的字段,但在大多数情况下,尽管在不同的实例中设置相同的字段。 我遇到的问题是在尝试设置expected_next,name,sw1,sw2,size和data字段时。 这是数据领域正在腐败。 我正在为这样的结构分配内存; void *command_malloc(int desc_size,int data_size) { return […]

作为参数传递的复合文字的生命周期是多少?

这使用clang编译时没有警告。 typedef struct { int option; int value; } someType; someType *init(someType *ptr) { *ptr = (someType) { .option = ptr->option | ANOTHEROPT, .value = 1 }; return ptr; } int main() { someType *typePtr = init( &(someType) { .option = SOMEOPT }); // do something else with typePtr } 这甚至是有效的C吗? 如果是这样的话:复合文字的生命周期是多少?

下一个结构项,不完整类型

struct node{ struct node next; int id; } 给出“下一个字段有不完整的类型错误”。 这个结构有什么问题?

MSVC中的复合文字

在海湾合作委员会,我能够这样做: (CachedPath){ino} inode->data = (struct Data)DATA_INIT; 哪里: struct CachedPath { Ino ino; }; typedef int8_t Depth; struct Data { Offset size; Blkno root; Depth depth; }; #define DATA_INIT {0, -1, 0} MSVC为这些类型的强制转换提供以下错误: error C2143: syntax error : missing ‘;’ before ‘{‘ 我怎样才能在MSVC中这样做? 进一步注意,代码已经从C99转换而来,我为此使用了指定的初始值设定项,然后进行类似的转换。 关于C99与C ++的MSVC / GCC实现之间如何关联这些各种特征的任何清晰都是值得赞赏的。

编译时的偏移量

有没有办法在编译时找到结构成员的偏移量? 我希望创建一个包含结构成员偏移量的常量。 在以下代码中, offsetof()宏在第一个printf语句中起作用。 但是,在第10行中使用声明ofs产生错误: “无法解析’ – >’运算符作为常量表达式”。 这样做还有其他方法吗? struct MyStruct { unsigned long lw; unsigned char c[5]; int i; int j; unsigned long last; }; const int ofs = offsetof(struct MyStruct, i); // This line in error int main(void) { printf(“Offset of c = %d.\n”, offsetof(struct MyStruct, c) ); printf(“Offset of i = %d.\n”, […]

使用qsort对struct指针数组进行排序

尝试在这个结构数组上使用qsort,我得到了奇怪的结果。 我有这个结构: struct access_data{ int sector; int arrival_time; int checked; int processed; }; 我从一个文件构造一个access_data指针数组,使它们按到达时间排序,但我需要稍后按扇区对它们进行排序,所以我有以下内容: int compare_data(const void* a, const void* b){ if (((access_data*)a)->sector sector) return 1; else if (((access_data*)a)->sector > ((access_data*)b)->sector) return -1; else return 0; } void scan(access_data* data[], int len, int sec_to_sec_seek){ qsort(data, len, sizeof(access_data*), &compare_data); show_data(data, len); } show_data只是打印数据,但我在示例输入上得到以下内容; 再次,按到达时间排序: data[0]: arrival_time: […]