相关疑难解决方法(0)

嵌套结构和c中的严格别名

请考虑以下代码:

typedef struct {
  int type;
} object_t;

typedef struct {
  object_t object;
  int age;
} person_t;

int age(object_t *object) {
  if (object->type == PERSON) {
    return ((person_t *)object)->age;
  } else {
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是合法代码还是违反了C99严格别名规则?请解释为何合法/非法.

c pointer-aliasing

17
推荐指数
1
解决办法
1732
查看次数

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

任何人都可以描述(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
查看次数

为什么这种隐式转换(在不同的指针类型之间)有效?

我发现自己处于以下情况:

#include <stdio.h>

typedef struct T1 { int id; } T1;  
typedef struct T2 { int id; } T2;

void f(T1 *ptr) { printf("f called\n"); }

int main(void) 
{
    T2 obj; 
    T2 *ptr = &obj; 
    f(ptr); // shouldn't this be a compilation error ? 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,这是无效的C++,但在C中,程序打印 "f called".这有效吗?

编辑

(以防万一不清楚)如果"结构上"不同,程序仍然可以编译和运行T2,例如

typedef struct T2 { double cc[23]; } T2;
Run Code Online (Sandbox Code Playgroud)

c pointers implicit-conversion

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

通过展开继承是否违反了严格的别名规则?

我有一个继承自struct Base的struct X. 但是,在我目前的设置中,由于对齐,X的大小为24B:

typedef struct {
    double_t a;
    int8_t b;
} Base;

typedef struct {
    Base base;
    int8_t c;
} X;
Run Code Online (Sandbox Code Playgroud)

为了保存内存,我想展开Base结构,所以我创建了包含Base的字段的struct Y(以相同的顺序,总是在struct的开头),所以struct的大小是16B :

typedef struct {
    double_t base_a;
    int8_t base_b;
    int8_t c;
} Y;
Run Code Online (Sandbox Code Playgroud)

然后我将在一个方法中使用struct Y的实例,该方法需要一个指向Base结构的指针:

void print_base(Base* b)
{
  printf("%f %d\n", b->a, b->b);
}
// ...
Y data;
print_base((Base*)&data);
Run Code Online (Sandbox Code Playgroud)

上面的代码是否违反了严格的别名规则,并导致未定义的行为?

c inheritance struct strict-aliasing

7
推荐指数
1
解决办法
319
查看次数

FFMPEG:将YUV数据转储为AVFrame结构

我正在尝试将YUV420数据转储到AVFrameFFMPEG 的结构中.从以下链接:

http://ffmpeg.org/doxygen/trunk/structAVFrame.html,我可以推导出我需要将我的数据输入

data[AV_NUM_DATA_POINTERS] 
Run Code Online (Sandbox Code Playgroud)

运用

linesize [AV_NUM_DATA_POINTERS].
Run Code Online (Sandbox Code Playgroud)

我试图转储的YUV数据是YUV420,图片大小是416x240.如此我如何将这个yuv数据转储/映射到AVFrame结构变量?我知道lineize表示步幅,即我想我的图片的宽度,我尝试过一些组合,但没有得到输出.我请求你帮我映射缓冲区.提前致谢.

ffmpeg yuv

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

类型转换的未定义行为?

请看以下示例:

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
查看次数