C 编码 :: 将结构写入内存块
C Coding :: Writing Structs into a Chunk of Memory
我正在做一个必须用标准 C 编码的项目。(不是 C++。)前一段时间,我写了下面的程序,将不同结构的内容写入二进制文件:
#include <stdio.h>
#include <stdlib.h>
typedef struct structA{
int a, b, c;
}AAA;
typedef struct structB{
int a, b, c, d, e;
}BBB;
int main( int argc, char **argv ){
// Create and open the output file
FILE *fd = fopen("test.txt", "w");
AAA* a1 = (AAA*)malloc( sizeof(AAA) );
AAA* a2 = (AAA*)malloc( sizeof(AAA) );
BBB* b1 = (BBB*)malloc( sizeof(BBB) );
a1->a = 1; a1->b = 2; a1->c = 3;
a2->a = 4; a2->b = 5; a2->c = 6;
b1->a = 10; b1->b = 20; b1->c = 30; b1->d = 40; b1->e = 50;
// Write all these structs to the file:
fwrite((char*)&a1, sizeof(AAA), 1, fd);
fwrite((char*)&a2, sizeof(AAA), 1, fd);
fwrite((char*)&b1, sizeof(BBB), 1, fd);
// Close the file
fclose( fd );
free( a1 );
free( a2 );
free( b1 );
printf("END OF PROGRAM.\n");
return 0;
}
上面的代码完美运行……尽管我不能通过查看输出来判断:
me@ubuntu:/home/me# more test.txt
▒$▒&V
me@ubuntu:/home/me#
我有另一个程序可以读取这个文件并从结构中提取所有信息。所以我知道上面的代码正是我想要的。
但是现在,我需要将这些结构写入 一块分配的内存,而不是写入文件。我认为这很容易:
#include <stdio.h>
#include <stdlib.h>
typedef struct structA{
int a, b, c;
}AAA;
typedef struct structB{
int a, b, c, d, e;
}BBB;
int main( int argc, char **argv ){
u_char* BlockOfMemory = (u_char*) malloc( sizeof(u_char) * 100 );
AAA* a1 = (AAA*)malloc( sizeof(AAA) );
AAA* a2 = (AAA*)malloc( sizeof(AAA) );
BBB* b1 = (BBB*)malloc( sizeof(BBB) );
a1->a = 1; a1->b = 2; a1->c = 3;
a2->a = 4; a2->b = 5; a2->c = 6;
b1->a = 10; b1->b = 20; b1->c = 30; b1->d = 40; b1->e = 50;
// Write all these structs into BlockOfMemory:
memcpy ( BlockOfMemory, &a1, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)), &a2, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)+sizeof(AAA)), &b1, sizeof( BBB ) );
printf("==> %hhn\n", BlockOfMemory);
free( a1 );
free( a2 );
free( b1 );
free( BlockOfMemory );
printf("END OF PROGRAM.\n");
return 0;
}
成功了吗?我不知道:
me@ubuntu:/home/me# gcc -Wall writeBlock.c
me@ubuntu:/home/me# ./a.out
==>
END OF PROGRAM.
me@ubuntu:/home/me#
这里的objective是内存块必须包含与二进制文件完全相同的信息。我在我的代码编译和运行的奇怪情况下,但考虑到我拥有的工具(VI 和 GCC),我无法验证我的代码是否正确或偏离目标。
有人可以指教吗?另外, memcpy()
会是这里使用的函数吗?谢谢。
编辑:修复了第一个程序时我错误地添加了第二个“free( b1 );”因为剪切粘贴错误。
正如已经指出的,您正在将指针 a1
的地址传递给 memcpy,a2
和 b1
也是如此。应该是
memcpy ( BlockOfMemory, a1, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)), a2, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)+sizeof(AAA)), b1, sizeof( BBB ) );
如果你想打印 BlockOfMemory
的内容,你需要转换回 AAA*
和 BBB*
并用指针运算移动,就像这样
unsigned char* tmp = BlockOfMemory;
AAA* x = (AAA*)tmp;
printf("==> %d %d %d\n", x->a, x->b, x->c);
tmp += sizeof(AAA);
x = (AAA*)tmp;
printf("==> %d %d %d\n", x->a, x->b, x->c);
tmp += sizeof(AAA);
BBB* y = (BBB*)tmp;
printf("==> %d %d %d %d %d\n", y->a, y->b, y->c, y->d, y->e);
我正在做一个必须用标准 C 编码的项目。(不是 C++。)前一段时间,我写了下面的程序,将不同结构的内容写入二进制文件:
#include <stdio.h>
#include <stdlib.h>
typedef struct structA{
int a, b, c;
}AAA;
typedef struct structB{
int a, b, c, d, e;
}BBB;
int main( int argc, char **argv ){
// Create and open the output file
FILE *fd = fopen("test.txt", "w");
AAA* a1 = (AAA*)malloc( sizeof(AAA) );
AAA* a2 = (AAA*)malloc( sizeof(AAA) );
BBB* b1 = (BBB*)malloc( sizeof(BBB) );
a1->a = 1; a1->b = 2; a1->c = 3;
a2->a = 4; a2->b = 5; a2->c = 6;
b1->a = 10; b1->b = 20; b1->c = 30; b1->d = 40; b1->e = 50;
// Write all these structs to the file:
fwrite((char*)&a1, sizeof(AAA), 1, fd);
fwrite((char*)&a2, sizeof(AAA), 1, fd);
fwrite((char*)&b1, sizeof(BBB), 1, fd);
// Close the file
fclose( fd );
free( a1 );
free( a2 );
free( b1 );
printf("END OF PROGRAM.\n");
return 0;
}
上面的代码完美运行……尽管我不能通过查看输出来判断:
me@ubuntu:/home/me# more test.txt
▒$▒&V
me@ubuntu:/home/me#
我有另一个程序可以读取这个文件并从结构中提取所有信息。所以我知道上面的代码正是我想要的。
但是现在,我需要将这些结构写入 一块分配的内存,而不是写入文件。我认为这很容易:
#include <stdio.h>
#include <stdlib.h>
typedef struct structA{
int a, b, c;
}AAA;
typedef struct structB{
int a, b, c, d, e;
}BBB;
int main( int argc, char **argv ){
u_char* BlockOfMemory = (u_char*) malloc( sizeof(u_char) * 100 );
AAA* a1 = (AAA*)malloc( sizeof(AAA) );
AAA* a2 = (AAA*)malloc( sizeof(AAA) );
BBB* b1 = (BBB*)malloc( sizeof(BBB) );
a1->a = 1; a1->b = 2; a1->c = 3;
a2->a = 4; a2->b = 5; a2->c = 6;
b1->a = 10; b1->b = 20; b1->c = 30; b1->d = 40; b1->e = 50;
// Write all these structs into BlockOfMemory:
memcpy ( BlockOfMemory, &a1, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)), &a2, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)+sizeof(AAA)), &b1, sizeof( BBB ) );
printf("==> %hhn\n", BlockOfMemory);
free( a1 );
free( a2 );
free( b1 );
free( BlockOfMemory );
printf("END OF PROGRAM.\n");
return 0;
}
成功了吗?我不知道:
me@ubuntu:/home/me# gcc -Wall writeBlock.c
me@ubuntu:/home/me# ./a.out
==>
END OF PROGRAM.
me@ubuntu:/home/me#
这里的objective是内存块必须包含与二进制文件完全相同的信息。我在我的代码编译和运行的奇怪情况下,但考虑到我拥有的工具(VI 和 GCC),我无法验证我的代码是否正确或偏离目标。
有人可以指教吗?另外, memcpy()
会是这里使用的函数吗?谢谢。
编辑:修复了第一个程序时我错误地添加了第二个“free( b1 );”因为剪切粘贴错误。
正如已经指出的,您正在将指针 a1
的地址传递给 memcpy,a2
和 b1
也是如此。应该是
memcpy ( BlockOfMemory, a1, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)), a2, sizeof( AAA ) );
memcpy ( (BlockOfMemory+sizeof(AAA)+sizeof(AAA)), b1, sizeof( BBB ) );
如果你想打印 BlockOfMemory
的内容,你需要转换回 AAA*
和 BBB*
并用指针运算移动,就像这样
unsigned char* tmp = BlockOfMemory;
AAA* x = (AAA*)tmp;
printf("==> %d %d %d\n", x->a, x->b, x->c);
tmp += sizeof(AAA);
x = (AAA*)tmp;
printf("==> %d %d %d\n", x->a, x->b, x->c);
tmp += sizeof(AAA);
BBB* y = (BBB*)tmp;
printf("==> %d %d %d %d %d\n", y->a, y->b, y->c, y->d, y->e);