0

奇妙なイベントが発生したときにEclipseでCアプリケーションをプログラミングしています。

構造体へのポインターを渡す関数があり、関数内で、このポインターに同じ型の他のポインターを割り当てます。このような単純な割り当てです

pointer = otherPointer;

次に、魔法のように、私の割り当てはプログラムによって完全に無視されます。私はgdbで改良しましたが、この行のプログラムパスのように見え、命令は無視されます。

この超常現象の原因を考えている人がいますか?

プログラムには、同様の動作を持つ同様の関数があり、割り当ては正しく行われます。

問題の関数は次のとおりです。

void uah_pcb_extract_queue_head (struct UAH_PCB * pPCB, struct UAH_PCB_Queue * pQueue)
{
  if (pQueue->head->next != NULL)
  {
    pPCB = pQueue->head;
    pQueue->head = pQueue->head->next;
  }
  else if (pQueue->head != NULL)
  {
    pPCB = pQueue->head;//this allocation
    pQueue->head = NULL;//in this line the value has not changed
    pQueue->tail = NULL;
  }
  else
  {
    pPCB = NULL;
  }
}
4

2 に答える 2

3

gdb に変更が見られない理由は、関数でpPCB再び使用されず、返されないため、おそらくコンパイラが関数からの割り当てを最適化したためです。

変更を関数の外の世界に影響を与えたい場合は、pointer へのポインターを渡し、それが指す値を変更する必要があります。

void uah_pcb_extract_queue_head (struct UAH_PCB ** pPCB, struct UAH_PCB_Queue * pQueue){
  /* code... */
  *pPCB = pQueue->head;
  /* more code... */
}

または、アドレスを返し、ポインターへのポインターの処理を避けることもできます。

 struct UAH_PCB * uah_pcb_extract_queue_head (struct UAH_PCB_Queue * pQueue){
  /* code... */
  struct UAH_PCB * pPCB = pQueue->head;
  /* more code... */
  return pPCB;
}
于 2013-03-29T20:51:05.177 に答える
0

ポインターをパラメーターとして返したい場合は、次の**構文を使用する必要があります。

例:

struct mystruct {
  int x, y;
};

void
myfunc (struct mystruct **pp) {
  *pp = malloc (sizeof mystruct);
}

/* ... */

int main(){
  struct mystruct *mystruct_p = NULL;
  /* After this call, mystruct_p should no longer be NULL... */
  myfunc(&mystruct_p); 
  /* do some more stuff */
}

この例の「pp」は、「ポインターへのポインター」の省略形です。

「お役に立てば幸いです!

于 2013-03-29T20:28:54.927 に答える