0

当从 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(&gtest);

在 http.c

httpinit(test * gtest)
{
  printf("baud: %d",gtest->u32baudrate);     //268435456: this is coming out wrong
}
4

5 回答 5

2

发现了问题,正在打包,通过这样做修复它-->

typedef PACKED struct _test
{
  ...
  uint8_t txsize[5];
  uint32_t u32baudrate;
  uint8_t flowcontrol;
  ...
}test;
于 2013-07-30T04:23:10.297 回答
1

问题很可能出在您尚未发布的代码中。

一些printf()实现使用了相对大量的堆栈;您的调试方法可能会导致堆栈溢出。尝试删除第一个printf调用,以便分配和调用之间没有任何内容httptest()。如果它没有损坏,则printf()它本身导致了问题,您可能需要分配更大的堆栈。

否则,可能会越界访问txsize[]。这真的是您正在测试的代码 -httptest()在分配后直接调用 - 还是您省略了呈现的代码?

于 2013-07-31T13:08:08.100 回答
1

我认为这可能会有所帮助,但不确定:)

typedef struct    //delete this so test is the struct type name// _test
{
  ...
  uint8_t txsize[5];
  uint32_t u32baudrate;
  uint8_t flowcontrol;
  ...
}test;
于 2013-07-30T05:44:31.720 回答
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(&gtest);
}
于 2013-07-30T07:06:02.457 回答
0

printf()格式说明符用于%d打印有符号整数。但是,uint32_t是无符号整数类型。无符号整数的常用格式说明符是%u.

于 2013-07-30T04:23:31.383 回答