相关疑难解决方法(0)

访问非活动的union成员和未定义的行为?

我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).

那么,这是不确定的行为?

c++ undefined-behavior unions language-lawyer

114
推荐指数
4
解决办法
2万
查看次数

具有相同成员类型的C结构是否保证在内存中具有相同的布局?

基本上,如果我有

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

c struct casting memory-layout

15
推荐指数
2
解决办法
1553
查看次数

是否可以将结构转换为另一个?

任何人都可以描述(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)

c sockets struct casting

14
推荐指数
2
解决办法
9305
查看次数

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

是否允许在同一项目中的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.当我将这些文件编译为同一项目的一部分时,没有错误,但我想了解这是否正确用法.

c typedef structure

12
推荐指数
1
解决办法
3173
查看次数

类型转换的未定义行为?

请看以下示例:

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因为他们有相同的成员和成员的顺序. …

c struct memory-address type-punning

6
推荐指数
1
解决办法
402
查看次数

将struct指针转换为另一个struct

此代码段打印该值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 …

c struct casting

2
推荐指数
2
解决办法
514
查看次数