You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用指针运算求取Packet结构体数组中出现频率最高的sourceIP

实现思路
  • 采用双层指针遍历的暴力统计方案,不需要额外哈希表,适合小规模数据集,全程仅使用指针运算,不出现任何方括号
  • 外层指针遍历每一个Packet元素,取其sourceIP作为待统计目标
  • 内层指针遍历全量Packet元素,匹配与待统计IP一致的元素并计数
  • 每次完成单个IP的计数后,和当前记录的最高出现次数对比,若更高则更新最高次数和对应的高频IP
完整可运行代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 复用你提供的结构体定义
typedef enum { IN_IN, IN_OUT, OUT_IN} Direction;
typedef enum { IGMP, TCP, UDP} Protocol;
typedef unsigned int Count;
#define NUM 6
typedef struct {
    long long timestamp;
    Direction direction;
    char sourceIP[16];
    char destIP[16];
    Protocol protocol;
    unsigned int port;
    Count bytes;
}Packet;

char* getMostFrequentSourceIP(Packet *packets, int N) {
    // 申请内存存储最高频IP和当前遍历IP,避免用方括号定义数组
    char *mostFreqIP = (char*)malloc(16 * sizeof(char));
    char *currentIP = (char*)malloc(16 * sizeof(char));
    int maxCount = 0;
    Packet *outerPtr = packets;

    for (int i = 0; i < N; i++) {
        int currentCount = 0;
        strcpy(currentIP, outerPtr->sourceIP);
        Packet *innerPtr = packets;

        // 内层遍历统计当前IP出现次数
        for (int j = 0; j < N; j++) {
            if (strcmp(currentIP, innerPtr->sourceIP) == 0) {
                currentCount++;
            }
            innerPtr++;
        }

        // 更新最高频记录
        if (currentCount > maxCount) {
            maxCount = currentCount;
            strcpy(mostFreqIP, currentIP);
        }
        outerPtr++;
    }

    free(currentIP);
    return mostFreqIP;
}

// 测试入口
int main() {
    Packet packetsarray[NUM] = {
        {42069, IN_OUT, "192.100.200.2", "192.10.0.6", TCP, 30, 256 },
        {666, OUT_IN, "148.201.196.208", "148.201.196.1", UDP, 80,666},
        {1002, IN_IN, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 },
        {1002, IN_OUT, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 },
        {1002, OUT_IN, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 },
        {1002, IN_OUT, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 }
    };
    char *res = getMostFrequentSourceIP(packetsarray, NUM);
    printf("出现频率最高的源IP是: %s\n", res);
    free(res);
    return 0;
}
代码说明
  • 核心逻辑全程没有使用任何方括号,所有结构体数组的访问都通过指针偏移实现:outerPtr和innerPtr每次自增1,就会自动偏移一个Packet结构体的大小,指向下一个元素
  • 字符串的复制和比较直接调用标准库的strcpy和strcmp即可,不需要手动遍历字符数组
  • 后续要扩展统计目标IP的功能,只需要把代码中所有的sourceIP替换为destIP即可,逻辑完全一致
  • 如果不允许使用malloc,可以直接把返回值设计为void,由调用方传入一个16字节的字符指针存储结果,同样不需要用到方括号

内容的提问来源于stack exchange,提问作者Humberto Longoria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:45:03