在C中更改函数内的字符数组

时间:2017-11-25 20:39:48

标签: c arrays function

在创建我模拟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 CChanging array inside function in C)中解决了一些类似的问题,但由于某种原因,即使使用指向字符数组的指针也无法正常工作case(从上面ideone链接中的代码输出可以看出)。我在这里做错了什么?

2 个答案:

答案 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);

与您的问题无关:

  • 无需在C中投射/ {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)

由于operator precedence*b[0]相当于*(b[0]),这不是您想要的。

*b周围添加一对括号是一个解决方案:

(*b)[0] = 0x12;