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 返回全局结构的指针_C_Pointers_Struct - Fatal编程技术网

C 返回全局结构的指针

C 返回全局结构的指针,c,pointers,struct,C,Pointers,Struct,我有一个定义协议规则的全局结构,如下所示 const struct schc_rule_t schc_rule_1 = { 0x01, &compression_rule_1, NOT_FRAGMENTED, 0, 0, 0, 0 }; 所有规则都分组在一个数组中 const struct schc_rule_t* node2_schc_rules[] = { &schc_rule_1 }; 可以将其分配给设备 const struct schc_device node2 =

我有一个定义协议规则的全局结构,如下所示

const struct schc_rule_t schc_rule_1 = { 0x01, &compression_rule_1, NOT_FRAGMENTED, 0, 0, 0, 0 };
所有规则都分组在一个数组中

const struct schc_rule_t* node2_schc_rules[] = { &schc_rule_1 };
可以将其分配给设备

const struct schc_device node2 = { 2, 1, &node2_schc_rules};
其中的
struct
如下所示

struct schc_device {
    uint32_t device_id;
    uint8_t rule_count;
    const struct schc_rule_t *(*context)[];
};
所有这些数组都是全局定义的,因为我正在为嵌入式设备实现这一点,并希望在
.text
部分中存储尽可能多的变量(我不确定这是否是最佳做法,但现在就可以了)

现在,, 我有一个查找函数,它尝试查找特定设备的规则

struct schc_rule_t* get_schc_rule_by_rule_id(uint8_t rule_id, uint32_t device_id) {
    int i;
    struct schc_device *device = get_device_by_id(device_id);

    if (device == NULL) {
        DEBUG_PRINTF("get_schc_rule(): no device was found for this id");
        return NULL;
    }

    for (i = 0; i < device->rule_count; i++) {
        struct schc_rule_t* curr_rule = (*device->context)[i];
        if(curr_rule->id == rule_id) {
            DEBUG_PRINTF("get_schc_rule(): %p %p \n", &schc_rule_2, curr_rule);
            return curr_rule;
        }
    }

    return NULL;
}
但是,每当我从另一个函数调用这个函数时,就像这样

struct schc_rule_t* ptr = get_schc_rule_by_rule_id(rule_id, device_id);
DEBUG_PRINTF("schc_fragment_input(): rule ptr %p \n", ptr);
我得到以下信息:

schc_fragment_input(): rule ptr 0xffffffff806f9bf0 

地址的最后32位似乎是正确的,但前16位不是,给我留下了一个无法访问的指针。有什么想法吗?

64位嵌入式设备?那将是哪个CPU?在您的开发环境中是否有不同的指针类型,如近/远/大?可能需要指定相应的返回和变量指针类型。我还发现指向不完整数组类型的指针很奇怪(我假设是这样):
*(*context)[
。IIUC您也可以使用指针对指针。这会改变什么吗?或者您正在编译为C89,之后可能会出现函数不兼容错误。或者,并非所有翻译单元都能看到结构,有些翻译单元将其视为不完整类型或类似类型。问题显然与您的项目文件结构以及哪些文件可以查看哪些函数/结构定义有关。从编译为
gcc-std=c11-pedanticerrors
或编译器的等效严格标准设置开始,以排除c89、-std=gnu等垃圾。我看到了一个
警告:函数的隐式声明“get_schc_rule_by_rule_id”[-Wimplicit function declaration]
,它将指针转换为
int
警告:赋值将指针从整数转换为不带强制转换[-Wint conversion]
)并导致我忘记包含一个文件,它现在工作正常。感谢您的回复64位嵌入式设备?那将是哪个CPU?在您的开发环境中是否有不同的指针类型,如近/远/大?可能需要指定相应的返回和变量指针类型。我还发现指向不完整数组类型的指针很奇怪(我假设是这样):
*(*context)[
。IIUC您也可以使用指针对指针。这会改变什么吗?或者您正在编译为C89,之后可能会出现函数不兼容错误。或者,并非所有翻译单元都能看到结构,有些翻译单元将其视为不完整类型或类似类型。问题显然与您的项目文件结构以及哪些文件可以查看哪些函数/结构定义有关。从编译为
gcc-std=c11-pedanticerrors
或编译器的等效严格标准设置开始,以排除c89、-std=gnu等垃圾。我看到了一个
警告:函数的隐式声明“get_schc_rule_by_rule_id”[-Wimplicit function declaration]
,它将指针转换为
int
警告:赋值将指针从整数转换为不带强制转换[-Wint conversion]
)并导致我忘记包含一个文件,它现在工作正常。谢谢你的回复
schc_fragment_input(): rule ptr 0xffffffff806f9bf0