2010-11-19 7 views
0

구조체의 주소를 우리가 지정한 주소로 설정하려고하지만 구조체의 주소를 출력 할 때 주소가 우리와 같은 값이 아닌 것처럼 보입니다 주어진. 라인연결된 목록에서 구조체 가리키는

node *root = (node *)&array; 

당신은 "배열"지역 변수의 주소를 취하고에서

/*a struct to keep block information*/ 
struct header{ 
    int space; 
    int free; /* 1 = free space and 0 = full*/ 
    struct header *nextHead; 
    struct header *prevHead; 
}; 

typedef struct header node; 

int myinit(int *array, int size){ 

    int newSize = size; 
    node * nullPointer; 
    nullPointer = NULL; //make intermediatry node pointer for some bullshit reason 

    * (array) = newSize; /*store the size of the malloc at the first address*/ 

    printf("Address : %p\n", &array[0]); 
    array++; 
    printf("Address after: %p\n", &array[0]); 

    /*initial block*/ 
    node *root = (node *)&array; /*store the root at the next address available*/ 
    printf("size of struct %lu\n", sizeof(struct header)); 

    printf("%p\n", root); 

    root->space = newSize; 
    root->free = 1; 
    root->nextHead = nullPointer; 
    root->prevHead = nullPointer; 


} 
+0

코드가 처음에는 잘 보인다 언뜻보기에 문제가 어디 있습니까? – DarkDust

답변

2

. IOW, 당신은 당신이 기대하는 것이 아닌, 스택에있는 가치의 주소를 취합니다. 함수의 서명을 다음과 같이 수정해야합니다.

int mymain(int **myarray, int size); 

해당 정의를 수정하십시오. 대신 &array[0]를 사용, 또한

node *root = (node *)array; 
+1

좋은 대답이지만 함수 정의가'int ** '대신'node **'를 사용해야한다고 덧붙이겠다. 또한, 왜 누군가가 링크 된리스트 노드를 배열에 저장하는지, 왜 newSize가 두 개의 다른 장소에 저장되는지에 대해서는 잘 모른다. 아마도 인터페이스 요구 사항은 여기서 제대로 이해되지 않을 것입니다. 내 코드에서 –

0

를이 코드 조각 array를 사용 : 그렇다면, 당신은 쓸 수 있습니다.
간단한 코드로 작성하고 작성하는 모든 행을 이해하면 포인터와 혼동하지 않게됩니다. 한 줄에 여러 줄의 앰퍼샌드 및 특수 기호를 사용하면 잘못된 상황이 발생할 수 있으므로 거미 감각을 익히십시오.

1
node *root = (node *)&array; 

여기 당신은 포인터의 주소를 획득하고 다른 포인터로 캐스팅. 너는 그렇게해서는 안된다. 여기 노드의 메모리를 할당해야합니다

node * root = (node *) malloc(sizeof(node)); 
// or this allocates the memory and puts zeros to it  
node * root = (node *) calloc(1, sizeof(node)); 

을 또한, 당신은, 당신은 단순히 다음과 같이 NULL을 사용할 수 있습니다 NULL을 가리키는 모든 노드를 필요가 없습니다

node->nextHeader = NULL; 
+0

malloc rewrite malloc 암시 적 호출을 사용할 수 없으므로 구조체를 만들고 그 안에 값을 설정할 수있는 다른 방법을 볼 수 있습니다. 값을 직접 NULL로 설정하면 컴파일 할 수 없으므로 설정하기 위해 중간 값을 만들어야했습니다. – Alex

+0

어떤 컴파일 오류가 발생합니까? 메모리를 할당하는 또 다른 방법으로 대답을 업데이트했습니다. –

관련 문제