将数据写入特定的内存地址问题

时间:2015-11-19 12:02:51

标签: c pointers

当我使用以下代码在内存的特定地址写入数据时,我得到一个错误告诉我

  

"参数1和#34中的类型错误;功能写。

据我所知,S_LEN是指向0x1814的指针,所以它应该以正确的方式工作,但在这种情况下,我得到了上一个错误。

当我通过write(S_LEN,0);替换命令write(&S_LEN,0);时,它工作正常。虽然在第一种情况下我将十六进制数转换为指向整数的指针。

任何人都可以解释这个问题吗?

#define RAM_START 0x1800
#define S_LEN  (((int32_t *)(RAM_START))[0xFF])
    int32_t write(int32_t *dest_ptr, int32_t src)
    {                                     
        *dest_ptr = src;
         return 0;
    } 

    main()
    {
     write(S_LEN,0);
    }

2 个答案:

答案 0 :(得分:0)

您的write函数期望 int32_t *作为第一个参数,这是一个指针,所以你应该使用类似的东西,如果你希望S_LEN成为指针:

#define S_LEN  (((int32_t *)(RAM_START))+0xFF)

由于您在int32_t(这是一个指针)上应用下标运算符 [],因此表达式的计算结果为int32_t *

另一方面,&S_LEN被接受,因为它会通过应用int32_t产生[]的地址。

另请注意,S_LEN4*0xFF+0x1800的内存位置0x1BFC相关。 (255之后int32_t 0x1800

答案 1 :(得分:0)

在您的代码中,S_LEN执行以下操作:

  1. 它将RAM_START转换为int32_t *
  2. 类型的指针
  3. 订阅类型为int32_t *的指针应为int32_t个数字
  4. 但是write需要第一个参数属于int32_t *类型,因此&S_LEN是正确的,因为int32_t返回的S_LEN的地址是输入int32_t *

    OSX 10.11的输出:

    [oxnz@rmbp:tmp:0]$ cc     a.c   -o a
    a.c:14:8: warning: incompatible integer to pointer conversion passing 'int32_t'
          (aka 'int') to parameter of type 'int32_t *' (aka 'int *'); take the
          address with & [-Wint-conversion]
            write(S_LEN,0);
                  ^~~~~
                  &(   )
    a.c:5:16: note: expanded from macro 'S_LEN'
    #define S_LEN  (((int32_t *)(RAM_START))[0xFF])
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    a.c:6:24: note: passing argument to parameter 'dest_ptr' here
    int32_t write(int32_t *dest_ptr, int32_t src)
                           ^
    1 warning generated.
    
    [oxnz@rmbp:tmp:0]$ cat a.c
    #include <stdio.h>
    #include <stdlib.h>
    
    #define RAM_START 0x1800
    #define S_LEN  (((int32_t *)(RAM_START))[0xFF])
    int32_t write(int32_t *dest_ptr, int32_t src)
    {
        *dest_ptr = src;
        return 0;
    }
    
    int main()
    {
        write(S_LEN,0);
    }