我对这个问题完全不知所措,我甚至不知道在我的问题中应该包括什么.

当我将一个常量转换为指针时,我的(.data+.bss+.noinit)部分增长了1K,超过了ATmega328P的容量.

PK16_TABLE_T* pk16_find_table_by_index(PK16_T* p_pkg, SIZE_T index)
{
    SIZE_T offset;
    PK16_TABLE_T* p_table;

    p_table = (PK16_TABLE_T*) 0;

    return p_table;
}

如果我转换指针,那么数据大小保持不变,而不是增加1K:

PK16_TABLE_T* pk16_find_table_by_index(PK16_T* p_pkg, SIZE_T index)
{
    SIZE_T offset;
    PK16_TABLE_T* p_table;

    p_table = (PK16_TABLE_T*) &offset;

    return p_table;
}

我从哪里开始调试呢?你还需要看到什么才能理解可能发生的事情?

/** A single entry in a PK16 package. */
typedef struct {
    /** Null-terminated string representing the path of this entry. */
    CHAR_T path[PK16_MAX_PATH_LEN];
    /** Index into the package data buffer of the start of this entry's data. */
    U16_T head;
    /** Length in bytes of this entry's data in the data buffer. */
    U16_T len;
    /** CRC32 of this entry's path + data. */
    U32_T crc;
} PK16_TABLE_T;

推荐答案

comments 中有人帮助我解决了这个问题,但他们出于某种原因删除了他们的 comments .

I used 100 to analyze what symbol got added.

这是CRC32多项式表!我不知道为什么常量的造型决定了这个符号是否包括在内,但这就是答案.

C++相关问答推荐

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

sizeof结果是否依赖于字符串的声明?

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

当我更改编译优化时,相同的C代码以不同的方式运行

为什么我不能只在内存地址中添加一个int来寻址任何数组?

C-使用指针返回修改后的整数数组

我的C函数起作用了,但我不确定为什么

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

我应该在递归中使用全局变量吗

Linux分段故障(核心转储)

GETS()在C++中重复它前面的行

共享目标代码似乎不能在Linux上的进程之间共享

浮动目标文件,数据段

将不同类型的指针传递给函数(C)

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

我该如何处理这个 C 90 代码中的内存泄漏?