Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为C中的缓冲区(struct类型)分配内存_C - Fatal编程技术网

为C中的缓冲区(struct类型)分配内存

为C中的缓冲区(struct类型)分配内存,c,C,我正在用以下结构编写一个C程序: struct packet_info{ char *ip_src; char *ip_dst; u_short th_sport; u_short th_dport; u_int th_seq; }; struct key_value{ struct packet_info key; long unsigned int value; }; 我想创建一个类型为key\u value的缓冲区,其中包

我正在用以下结构编写一个C程序:

struct packet_info{
    char *ip_src;
    char *ip_dst; 
    u_short th_sport;
    u_short th_dport; 
    u_int   th_seq;
};

struct key_value{
    struct packet_info key;
    long unsigned int value;
};
我想创建一个类型为
key\u value
的缓冲区,其中包含1000个项目(最大大小)。然而,我不知道如何为它分配内存

我是这样做的:

struct key_value *buffer = malloc(MAX_SIZE * sizeof(struct key_value))
然而,在阅读了以下问题/答案之后,我得出结论,我还需要为
char*ip_src
char*ip_dst
分配空间


毕竟,为缓冲区分配内存的正确方法是什么?

正确的方法是为每个指针分配一些内存

假设您要存储,您还可以为
ip_src
ip_dst
指定大小,如下所示

struct packet_info{
/* to represent IPv4 in raw bytes */
    char ip_src[4];
    char ip_dst[4]; 
/* to represent IPv4 in string */
    char ip_src[16];
    char ip_dst[16];
    u_short th_sport;
    u_short th_dport; 
    u_int   th_seq;
};
这样就省去了为每个指针分配内存的麻烦

编辑:我没有考虑到你可能试图存储IP字符串而不是原始字节

为什么是4号的?为了简单起见,an总共有4个字节,每个字节代表地址的一部分。如果需要字符串,也可以应用相同的逻辑,方法是将16(12个数字+3个点+尾随
\0
)替换为字符串

对于,需要16个字节来表示原始字节,因此只需将4替换为16,如果您想要一个字符串,则需要40个字节来表示任何IPv6字符串(32个十六进制数+7个冒号+尾随
\0


假设你想要堆上的所有东西,我会这样做:

struct key_value *buffer = malloc(MAX_SIZE * sizeof(struct key_value))
#包括
#包括
#包括
#包括
#定义最大尺寸1000
类型定义结构包信息{
char*ip_src;
字符*ip_dst;
未签名的短THU运动;
无符号短端口;
无符号整数序列;
}分组信息;
typedef结构键值{
分组信息密钥;
长无符号整数值;
}关键值;
int main(){
键值*缓冲区=malloc(最大键大小*大小(键值));

对于(int i=0;i举一个您想在
ip_src
中看到的示例,“key_值类型的缓冲区”意味着您应该
typedef
您的结构。为什么要使用calloc?
calloc(N,sizeof(char))
相当于
p=malloc(N*sizeof(char));memset(p,0,N*sizeof(char))我知道,但是为什么你需要memset,为什么你要提出它?因为初始化内存比实例化内存更可取。不能保证它不会有垃圾内容。输入的数量是一样的。运行时性能差异会很小,如果没有,@imll可以自由地对其进行优化检查
malloc
/
calloc
的返回值,确保其不为null;。这比只回答问题要好得多。您还应该考虑IPv6的完整性。针对IPv6和字符串大小写进行编辑
gcc -g -std=c11 -c main.c
gcc main.o -o main.exe
(gdb) b 36
Breakpoint 1 at 0x401632: file main.c, line 37.
(gdb) r
Starting program: C:\Users\Pedro\Desktop\t\main.exe

Breakpoint 1, main () at main.c:37
37              for(int i=0; i<MAX_SIZE; i++) {
(gdb) p buffer
$1 = (key_value *) 0x5044d0
(gdb) p buffer[0]
$2 = {key = {ip_src = 0x5020d0 "127.0.0.1", ip_dst = 0x502110 "8.8.8.8", 
             th_sport = 69, th_dport = 420, th_seq = 3131961357}, value = 10}
(gdb) p buffer[0].key.th_seq
$3 = 3131961357
(gdb) p buffer[2]
$3 = {key = {ip_src = 0x3021d0 "", ip_dst = 0x302210 "",
             th_sport = 0, th_dport = 0, th_seq = 0}, value = 0}