小编SRI*_*NTH的帖子

为什么在最后一个大小为1个字节的成员之后需要填充

我已经读过字符是一种特例,在单个机器单词中的任何位置它们都同样昂贵,因此它们没有首选的对齐方式。

根据上述声明两者的尺寸Struct_1Struct_2应为5个字节。在Struct_1正在占用5个字节按期望但Struct_2正在占用8个字节。

请解释一下这背后的原因。

更进一步,我已经在中打印了各个成员的地址Struct_2。它确认在最后一个成员之后添加了填充空间char g

为什么在最后一个成员的末尾需要填充?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Struct_1 {
    char a;
    char b;
    char c;
    char d;
    char e;
} Struct_1;

typedef struct Struct_2 {
    int  f;
    char g;
} Struct_2;

int main(void) {
    Struct_2 strc2;

    printf("\tsizeof(Struct_1): %ld\n", sizeof(Struct_1));
    printf("\tsizeof(Struct_2): %ld\n", sizeof(Struct_2));

    printf("\tsizeof(strc2.f) : %ld\n\n", sizeof(strc2.f));

    printf("\t&(strc2.f) = %p\n", &(strc2.f));
    printf("\t&(strc2.g) = %p\n", &(strc2.g));

    return (0);
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出:

sizeof(Struct_1): 5 
sizeof(Struct_2): …
Run Code Online (Sandbox Code Playgroud)

c compilation padding

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

使用可变参数的宏

请让我知道是否有办法在宏函数中使用变量参数并使下面的宏代码工作。

换句话说,有什么方法可以在 va_start 中使用局部变量。

typedef struct
{
    char *p1;
    char *p2;
    char *p3;
}Pointers;

#define NULLCHECK_VR(num, ...)                          \
        {                                               \
            va_list valist;                             \
            int     v_index;                            \
                                                        \
            va_start(valist, num);                      \
                                                        \
            for( v_index=0; v_index < num; v_index++)   \
            {                                           \
                if( NULL == va_arg(valist, void *))     \
                {                                       \
                    printf("NULL \n");                  \
                }                                       \
                else                                    \
                {                                       \
                    printf("NOT NULL \n");              \
                }                                       \
            }                                           \
                                                        \
            va_end(valist);                             \
        }

int main(void)
{
    Pointers ptr;

    memset(&ptr, 0, sizeof(Pointers));

    NULLCHECK_VR(3, ptr.p1, …
Run Code Online (Sandbox Code Playgroud)

c c++ variadic-functions

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

标签 统计

c ×2

c++ ×1

compilation ×1

padding ×1

variadic-functions ×1