簡體   English   中英

在C函數中更改字符數組

[英]Changing a character array inside a function in C

在創建我在此處模擬的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線程中也解決了一些類似的問題(例如,使用C?中的函數更改數組,使用C中的函數 傳遞和更改數組,使用C中的函數 更改數組 ),但由於某種原因,即使使用指向字符數組的指針也是如此在我的情況下不起作用(如上面ideone鏈接中的代碼輸出所示)。 我在這里做錯了什么?

[]運算符比*運算符的綁定更緊密,因此請更改

*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指針強制轉換為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指向的類型時繼續存在。

由於運算符優先級*b[0]等效於*(b[0]) ,這不是您想要的。

*b周圍添加一對括號是一種解決方案:

(*b)[0] = 0x12;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM