2013-03-29 111 views
0

我正在用eclipse编写一个C应用程序,当发生奇怪的事件时。忽略指针赋值

我有一个函数,而我将指针传递给STRUCT,则函数内部,我分配给这个指针相同类型的其它指针,一个简单的分配这样

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; 
    } 
} 
+0

如果添加的源代码,你的问题 –

+0

向我们展示你的代码,而不是描述它,它会有所帮助。 – LihO

+1

*“像这样简单的分配'pointer = otherPointer;'”* - 这只是一个赋值,在那个语句中没有分配。 – LihO

回答

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”是“指向指针的指针”的缩写。

'希望有帮助!

+0

如果您要返回指针,则不需要传递指针。在这种情况下,一个'*'就足够了 – 2013-03-29 20:31:27

+0

@Armin:是的,但是方法签名说:'void'。这似乎是正确的方法,也是惯用的C。 – brice

+1

@brice然后他为什么要返回'pp'。如果你希望返回一个指针作为参数,那么你必须使用**语法:*,自相矛盾。 – 2013-03-29 20:47:47

3

你甚至没有看到gdb的改变的原因是你的编译器可能已经优化了你的函数的赋值,因为pPCB不再被使用,并且不会返回。

如果你想改变影响世界的功能之外,您将需要一个指针传递给一个指针,然后改变它指向的值:

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; 
} 
+0

是的,这是一个好主意,但是这个问题,奇怪的是,在代码的其他地方,我有一个类似的函数,它具有相同的分配,它的操作是正确的。 ¿可能存在一些细微的原因,其中编译器忽略指令或跳转此行?我知道这很奇怪,但代码是好的 非常感谢! – SantiCDS