我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).
那么,这是不确定的行为?
基本上,如果我有
typedef struct {
int x;
int y;
} A;
typedef struct {
int h;
int k;
} B;
Run Code Online (Sandbox Code Playgroud)
我有A a,C标准保证((B*)&a)->k是否相同a.y?
任何人都可以描述(struct sockaddr *)&server这里的运作方式 是否有可能将更大的结构转换为更小的结构?
看到这些结构:
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
Run Code Online (Sandbox Code Playgroud)
这是主要计划:
int main(int argc , char …Run Code Online (Sandbox Code Playgroud) 是否允许在同一项目中的2个不同c文件中使用具有不同定义的相同名称结构.例如.
FILE1.C
typedef struct
{
unsigned int unVar;
} abc;
Run Code Online (Sandbox Code Playgroud)
file2.c中
typedef struct
{
int var;
} abc;
Run Code Online (Sandbox Code Playgroud)
两个文件中都使用了abc.当我将这些文件编译为同一项目的一部分时,没有错误,但我想了解这是否正确用法.
请看以下示例:
typedef struct array_struct {
unsigned char* pointer;
size_t length;
} array;
typedef struct vector_struct {
unsigned char* pointer;
// Reserved is the amount of allocated memory not being used.
// MemoryLength = length + reserved;
size_t length, reserved;
} vector;
// Example Usage:
vector* vct = (vector*) calloc(sizeof(vector), 1);
vct->reserved = 0;
vct->length = 24;
vct->pointer = (unsigned char*) calloc(arr->length, 1);
array* arr = (array*) vct;
printf("%i", arr->length);
free(arr->pointer);
free(arr);
Run Code Online (Sandbox Code Playgroud)
C似乎按照它们在结构中定义的顺序为结构成员分配内存.这意味着如果你投射vector -> array你仍会得到相同的结果如果你执行操作array就像你做的那样,vector因为他们有相同的成员和成员的顺序. …
此代码段打印该值5.我不明白为什么.
#include <stdio.h>
struct A
{
int x;
};
struct B
{
struct A a;
int y;
};
void printA(struct A *a)
{
printf("A obj: %d\n", a->x);
}
int main()
{
struct B b = {
{
5
},
10
};
struct A *a = (struct A*)&b;
printA(a);
printf("Done.\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我创建时b,指向它的指针将指向数据{ {5}, 10 }.
当我&b转向时struct A*,我向编译器保证这struct A*指向数据类型的单个数据元素的结构int.相反,我提供一个指针数据类型的两个数据元素的结构struct A,int.
即使第二个变量被忽略(因为struct …