【问题标题】:Mismatch in data copy to a function argument in function call数据复制不匹配到函数调用中的函数参数
【发布时间】:2015-01-04 00:16:01
【问题描述】:

我在嵌入式 C 环境中有以下代码,编译器:Hightec (Big-Endian)

unsigned char GlobalVar;

Func_A()
{
unsigned char var1,Retval;
var1 = 0;

retval = Func_B(0,&var1);

}


unsigned char Func_B (unsigned char val, void* ptr )
{
unsigned long localvar;

localvar = (unsigned long)GlobalVar;
*(unsigned char*)ptr  = (unsigned char)localvar;
return (0);
}

输入: 全局变量 = 1 , Func_A 调用 Func_B。

预期输出: Func_B 被调用, 第二个参数更新为值 1。

我所看到的: Func_B 被调用, 第二个参数保存值 64 (0100 0000)。

其他 cmets

1. Func_A is an application file.        
 2. Func_B is part of a different software module.

     3. Func_A reads the value from Func_B to do some action in application.
     4. Func_B reads the value from a global variable (it is an array) and copies it into  the second argument passed to it.
     5. The second argument is a void* because Func_B can read different global variables and finally it would typecast based on parameter 1
    (this part is not related, so i have excluded the related code)

你觉得这里发生了什么?

已编辑

重新编辑

抱歉,我匆忙结束了问题

我在这里面临的问题

  1. var1FUNC_A 的局部变量
  2. FUNC_Bvar1的地址中的值得到更新
  3. FUNC_B 返回时,var1 的值仍然是旧值。

我是如何解决的

  1. 我将变量 var1 设为全局变量。
  2. 我看到数据了

我的怀疑

  1. var1 是在 FUNC_A 中分配的
  2. FUNC_A 调用 FUNC_B,分配的空间超出了更新数据的范围

各位专家怎么看?我真的很想知道这种行为的根本原因是什么?

【问题讨论】:

  • 请编辑您的问题以包含正确且功能正常的代码,这些代码不会给出编译器错误或警告。最好是Minimal, Complete, and Verifiable example
  • Func_A 中的 retval 在哪里,您应该使用 Retval.. 这不会编译
  • “真实代码”与您发布的不同,或者您的编译器有错误(可能是前者)
  • 嗨,是的,真正的代码是不同的......因为我只能访问其中的一部分并且我没有在代码中看到明显的问题,所以我迅速跳进去看看是否有什么问题在代码中真的很讨厌。看到完整代码后,我可以自己解决问题了
  • @MattMcNabb : 你能检查一下并回复吗?

标签: c casting compilation embedded stack-memory


【解决方案1】:

Unsigned long 是 4 字节长度,unsigned char 是 1 字节长度。您将 1 字节值分配给 4 字节值,然后再次将该 4 字节值分配给 1 字节值。在 unsigned long 变量的剩余 3 个字节中可能存在垃圾值,并且可能会分配(基于字节序)给您的 unsigned char 变量。

【讨论】:

  • 我明白这一点,但你不认为类型转换(它是无符号字符)应该返回 LSB,而不管字节顺序如何
  • 我已经编辑了原始问题,你能提供你的意见
【解决方案2】:

你看到了什么:Func_B is called, Second parameter holds value 64 (0100 0000).

unsigned char Func_B (unsigned char val, void* ptr )
{
    unsigned long localvar;

    printf("val = %d\n", *(unsigned char*)ptr);
    /*HERE : val = 0*/
    localvar = (unsigned long)GlobalVar;

    *(unsigned char*)ptr  = (unsigned char)localvar;

    return (0);
}

我看到的:从上面的函数中,第二个参数是void *ptr。当我尝试打印它的内容时,该值符合预期。 val = 0.

@DarkKnight:How did you check the value of the second parameter ?

【讨论】:

  • @Santhosh :我在调试器中检查了第二个变量的值。你是用大端平台编译的吗? GlobalVar 用值 1 更新,复制到第二个参数中
  • 使用上面提到的代码,我尝试打印相同的结果,结果符合预期。我认为使用调试器,它正在尝试读取 4 个字节。将参数类型从void * 更改为unsigned char 并尝试。输出将是相同的
  • 我已经编辑了原始问题,你能提供你的意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2013-12-01
  • 2012-05-09
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多