关于c语言中的字节对齐padding问题

在C语言中,结构体的字节对齐可能导致内存中的额外填充字节,影响memcmp的比较结果。举例说明,尽管结构体字段值相同,由于padding字节的不同(栈分配与堆分配的差异),memcmp返回不相等。因此,使用memcmp比较结构体时需谨慎,建议明确了解编译器行为或逐字段比较。
摘要由CSDN通过智能技术生成

  最近的工作中,发现有一个很奇怪的问题,就是两个结构体,里面的字段的值完全是一样的,但是用memcpy就是不返回0。大致是下面的代码:

 

输出是:aa != bb

            bb != cc

 

为什么设的值都是一样的,但是memcmp就是返回不一样呢。memcpy还算是一个比较常用的函数,特别

C语言,可以使用以下代码来实现BMP图像进行4字节对齐填充的操作: ```c #include <stdio.h> #include <stdlib.h> // 填充0数据直到n字节对齐 void alignTo4Bytes(FILE* file, int n) { int padding = (4 - (n % 4)) % 4; // 计算需要填充的字节数 // 填充0数据 for (int i = 0; i < padding; i++) { fputc(0, file); } } int main() { // 打开BMP文件 FILE* bitmapFile = fopen("input.bmp", "rb"); FILE* alignedFile = fopen("output.bmp", "wb"); // 读取BMP文件头 unsigned char header[54]; fread(header, sizeof(unsigned char), 54, bitmapFile); // 写入BMP文件头 fwrite(header, sizeof(unsigned char), 54, alignedFile); // 读取图像数据 int width = *(int*)&header[18]; int height = *(int*)&header[22]; int bitsPerPixel = *(int*)&header[28]; int rowSize = width * (bitsPerPixel / 8); // 每行的字节数 alignTo4Bytes(bitmapFile, rowSize); // 对齐填充 // 复制图像数据 unsigned char* buffer = (unsigned char*)malloc(rowSize); for (int i = 0; i < height; i++) { fread(buffer, sizeof(unsigned char), rowSize, bitmapFile); fwrite(buffer, sizeof(unsigned char), rowSize, alignedFile); alignTo4Bytes(alignedFile, rowSize); // 对齐填充 } // 关闭文件 fclose(bitmapFile); fclose(alignedFile); // 释放内存 free(buffer); return 0; } ``` 以上代码假设输入的BMP文件名为"input.bmp",输出的对齐后的BMP文件名为"output.bmp"。代码的`alignTo4Bytes`函数用于填充0数据直到n字节对齐。在主函数,首先读取BMP文件头信息并写入对齐后的文件,然后逐行读取图像数据并写入对齐后的文件,每行结束后都进行4字节对齐填充。 请注意,在使用此代码时,需要确保输入的BMP文件存在且是有效的24位或32位BMP图像。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值