请考虑以下代码:
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严格别名规则?请解释为何合法/非法.
任何人都可以描述(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) 我发现自己处于以下情况:
#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) 我有一个继承自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)
上面的代码是否违反了严格的别名规则,并导致未定义的行为?
我正在尝试将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表示步幅,即我想我的图片的宽度,我尝试过一些组合,但没有得到输出.我请求你帮我映射缓冲区.提前致谢.
请看以下示例:
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 ×5
struct ×3
casting ×1
ffmpeg ×1
inheritance ×1
pointers ×1
sockets ×1
type-punning ×1
yuv ×1