2013-11-29 3 views
0

Когда я отлаживать ОСА, я сделал следующие изменения, чтобы убить ошибку:использование Int указателя в C

struct proc { 
    int p_status; 
}; 
int *status; 
struct proc *childP; 

Перед:

*status = childP->p_status; 

Я изменил его:

status = &childP->p_status; 

Тогда ОС отлично работает. Но из моего понимания, не должны ли предыдущие и более поздние работы одинаковыми? В чем разница между ними? Спасибо!

+0

Чтобы дать вам подсказку: в чем разница между изменением адреса на конверте, чтобы письмо переходило в другой дом и отправляло другое письмо на тот же адрес? –

ответ

0

*status = childP->p_status; означает: назначить ячейку памяти, которая status указывает с childP->p_status значением

status = &childP->p_status; означает: установить status, чтобы указать на ячейку памяти childP->p_status

0

В * и & операторы несколько перегружены и это легкая ошибка.

typename * variable 
//e.g. 
int * status; 

объявляет переменную типа Int - оператор * в этом случае является обязательным для TypeName и становится модификатором.

* variable 

означает the contents of the address pointed to by variable

#include <iostream> 
int main() { 
    char text[] = "hello, world!"; 
    char* p = text; // declare 'p' as a 'char*' and point it to 'h' 
    *p = 'H'; // change the first letter of text to a capital 
    std::cout << text << '\n'; 
    return 0; 
} 

Живая демонстрация: http://ideone.com/mmi9UH

Существуют различные способы, вы можете написать эти заявления, некоторые программисты предпочитают ставить * на левой стороне при объявлении переменных, чтобы сделать это отличное от

int* status; 
int * status; 
int *status; 

все объявляют одну и ту же переменную. Тем не менее, он становится мутным, используя первую форму, когда вы должны объявить несколько переменных

int* p1, p2; 

объявляет указатель p1, но p2 это просто INT

int * p1, * p2; 
int *p1, *p2; 

объявить два указателя. Левша-указатель типа имеют тенденцию делать

int* p1; 
int* p2; 
+0

Привет, вы можете сказать: * p = 'H'; правильно? – lkkeepmoving

+0

@lkkeepmoving haha ​​- yes :) – kfsone

+0

Исправлена ​​также идеонная демонстрация. – kfsone

0

если status не указывает на выделенную память, прежде чем *status = childP->p_status; то есть ошибка. поскольку указатель состояния укажет на неизвестный адрес памяти.

Второй вариант означает, что статус указывает на тот же адрес члена структуры. Этот указатель действует как псевдоним - более короткая версия &childP->p_status

0

Я думаю, проблема в том, что вы пытаетесь получить доступ к значению до его создания. Когда вы пытаетесь вызывать сегмент ChildP-> p_status, вы еще не загрузили значение в p_status, поэтому результатом является ошибка.

Второй, где вы загружаете статус с адресом, вместо этого дает структуру конкретное значение для решения - и, на мой взгляд, лучший способ сделать это. Всегда лучше сначала установить значение самого указателя, а не значение указателя.

Смежные вопросы