在创建我模拟here的Linux模块时,我遇到了一个问题。
#include <stdio.h>
#include <stdlib.h>
void changeBuff(unsigned char ** b)
{
*b[0] = 0x12;
*b[1] = 0x34;
}
int main(void) {
unsigned char * buf = (unsigned char *)malloc(sizeof(unsigned char) * 2);
buf[0] = 0x55;
buf[1] = 0xAA;
printf("%x\t%x\n", buf[0], buf[1]);
changeBuff(&buf);
printf("%x\t%x\n", buf[0], buf[1]);
return 0;
}
长话短说,我试图在函数内更改数组的值。虽然第一个索引的值发生了变化,但第二个索引的变化不会发生同样的情况。上面代码的输出是
55 aa
12 aa
在其他stackoverflow线程(例如Changing an array with a function in C?,Pass and change array inside function in C,Changing array inside function in C)中解决了一些类似的问题,但由于某种原因,即使使用指向字符数组的指针也无法正常工作case(从上面ideone链接中的代码输出可以看出)。我在这里做错了什么?
答案 0 :(得分:3)
[]
运算符绑定比*
- 运算符更紧密,因此更改
*b[0] = 0x12;
到
(*b)[0] = 0x12;
或者改变
void changeBuff(unsigned char ** b)
{
*b[0] = 0x12;
*b[1] = 0x34;
}
到
void changeBuff(unsigned char * b)
{
b[0] = 0x12;
b[1] = 0x34;
}
而不是像这样调用它
changeBuff(&buf);
像这样称呼它
changeBuff(buf);
与您的问题无关:
void
- 指针。sizeof (char)
等于1。所以这一行
unsigned char * buf = (unsigned char *)malloc(sizeof(unsigned char) * 2);
等于此
unsigned char * buf = malloc(2);
更强大的版本将是
unsigned char * buf = malloc(2 * sizeof *buf);
可以在更改buf
指向的位置类型后继续使用。
答案 1 :(得分:1)