当我使用以下代码在内存的特定地址写入数据时,我得到一个错误告诉我
"参数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);
}
答案 0 :(得分:0)
您的write
函数期望 int32_t *
作为第一个参数,这是一个指针,所以你应该使用类似的东西,如果你希望S_LEN
成为指针:
#define S_LEN (((int32_t *)(RAM_START))+0xFF)
由于您在int32_t
(这是一个指针)上应用下标运算符 []
,因此表达式的计算结果为int32_t *
。
另一方面,&S_LEN
被接受,因为它会通过应用int32_t
产生[]
的地址。
另请注意,S_LEN
与4*0xFF+0x1800
的内存位置0x1BFC
相关。 (255
之后int32_t
0x1800
。
答案 1 :(得分:0)
在您的代码中,S_LEN
执行以下操作:
RAM_START
转换为int32_t *
int32_t *
的指针应为int32_t
个数字但是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);
}