当从main传递给httpinit()时,我在变量u32baudrate中发现了一些数据损坏。但其他变量txsize和flowcontrol正确出现。
typedef struct _test
{
...
uint8_t txsize[5];
uint32_t u32baudrate;
uint8_t flowcontrol;
...
}test;
来自main.c的
test gtest;
gtest.u32baudrate=921600;
printf("baud: %d",gtest.u32baudrate); //921600: this is coming out right
httpinit(>est);
在http.c
中httpinit(test * gtest)
{
printf("baud: %d",gtest->u32baudrate); //268435456: this is coming out wrong
}
答案 0 :(得分:2)
发现问题,它正在打包,通过这样做来修复它 - >
typedef PACKED struct _test
{
...
uint8_t txsize[5];
uint32_t u32baudrate;
uint8_t flowcontrol;
...
}test;
答案 1 :(得分:1)
我认为这可能有所帮助,但不确定:)
typedef struct //delete this so test is the struct type name// _test
{
...
uint8_t txsize[5];
uint32_t u32baudrate;
uint8_t flowcontrol;
...
}test;
答案 2 :(得分:1)
问题很可能出在您尚未发布的代码中。
一些printf()
实现使用相对大量的堆栈;您的调试方法可能导致堆栈溢出。尝试删除第一个printf
来电,以便在分配和httptest()
通话之间没有任何内容。如果它没有被破坏,printf()
本身就会导致问题,你可能需要分配一个更大的堆栈。
否则可能会对txsize[]
进行越界访问。这真的是您正在测试的代码 - 在分配后直接调用httptest()
- 或者您是否已经省略了所提供的代码?
答案 3 :(得分:0)
printf()
格式说明符%d
用于打印有符号整数。但是,uint32_t
是无符号整数类型。无符号整数的通常格式说明符是%u
。
答案 4 :(得分:0)
Packed与此错误无关。通常,printf上的错误会导致堆栈损坏。考虑一下:
struct wp_char{
char wp_cval;
short wp_font;
short wp_psize;
}v1;
struct wp_char v2;
v1和v2有什么区别?它们不同或相同吗?哎呀......误按了回车键。
顺便说一下,以下代码对我来说非常适合。
#include <stdio.h>
#include <limits.h>
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef struct _test
{
uint8_t txsize[5];
uint32_t u32baudrate;
uint8_t flowcontrol;
}test;
print_value(test *gtest)
{
printf("%u\n", gtest->u32baudrate);
}
main()
{
test gtest;
gtest.u32baudrate = 921600;
printf("%u\n", gtest.u32baudrate);
print_value(>est);
}