2012-10-11 3 views
0

나는 약간의 기억이 있고 나는 그것을 여러 조각으로 할당하려한다. 그래서 나는 연결된 목록을 가지고 있습니다. 각 노드는 할당 된 메모리 조각과 다음 노드의 크기를 추적합니다.포인터 + int 대 포인트 -

리퀘 스터에 포인터를 반환하면 리퀘 스터가 사용할 메모리가 필요하기 때문에이 노드가 끝난 직후 포인터를 반환합니다 (return newNode + sizeOf (node)).

노드를 변경하여 문제를 해결하려고하면 문제가 발생합니다. 포인터로 myFree를 호출 할 때 포인터 크기 sizeOf (노드)를 사용하여 노드에 도달하면 작동하지 않습니다.

내가 뭘 잘못하고 있니?

나는 그것이 유용하지만, 여기에 몇 가지 코드를 생각하지 않습니다 :

#define HEADER(24) 
printf("Original pointer %-10p\n", pointer); 
head *toUse = pointer + HEADER; 
printf("Pointer to memory to be used %-10p\n", toUse); 
printf("Trying to read the header again %-10p\n", toUse - HEADER); 

첫 번째와 세 번째의 printf 나에게 다른 주소를 제공합니다. 그것이 문제이다.

테스트의 경우 처음에는 한 조각의 메모리 만 할당하고 여전히 작동하지 않습니다.

+1

일부 코드를 표시 할 수 있습니까? – chris

+1

코드하십시오 .... – Mike

+0

여러 청크로 할당하는 경우 청크가 서로 옆에 있지 않을 수 있으므로 pointer-sizeof (노드)가 반드시 이전 노드의 시작 부분에 놓는 것은 아닙니다. –

답변

1

C에서 (pointer + n)&pointer[n]과 같습니다. 즉, 인덱스는 포인터가 가리키는 항목을 바이트로 계산하지 않습니다. 바이트 오프셋을 원하면 ((char*)pointer + n)을 사용하십시오. 그러나 당신의 경우에는 바이트 오프셋이 필요 없다. 대신

return newNode + sizeof(node); 

당신은

return newNode + 1; 

또는

return &newNode[1]; 

당신은 아마 당신이 뭔가에 대한 포인터를 반환하는 경우 (void*)에 그 캐스팅 할 만

을 수행 할 수 호출 할 수 모든 유형으로 사용하십시오. (void*) 포인터에서 원래 노드로 돌아가려면 (node*)vp - 1 또는 (node*)((char*)vp - sizeof(node))을 사용하십시오.또한

,

#define HEADER(24) 
은 함수와 같은 매크로를 유사하기 때문에

가 컴파일되지 않습니다; 매크로 이름과 왼쪽 괄호 사이에 최소한 하나의 공백이 필요합니다 (괄호는 생략하십시오).

+0

고맙습니다. 당신이 옳았. 포인터 유형이 다릅니다. – xBlue

1

문제를 해결하기위한 충분한 코드를 제공해주지 않았습니다. 그러나, 나는 짐작할 수있다.

우리에게 pointer의 선언을 보여주십시오. 나는 그것이 이 아닌 것 같아요.head *pointer;입니다. 포인터 산술은 포인터의 유형을 고려합니다.

int에 대한 포인터에 1을 추가하면 포인터가 1 * sizeof int 바이트 씩 증가합니다. 형식이 short이면 1 * sizeof short 바이트가 증가합니다. 꼭 같은 것은 아닙니다. pointer 경우

그래서, (다시, 예를 들어)이 HEADER (24)로 포인터를 증가에 후 (sizeof char 항상 있기 때문에 1) 바이트 HEADER를 추가 char *pointer으로 선언했다. 그러나 나중에 HEADERhead*toUse에서 빼면 HEADER * sizeof head 바이트 씩 감소합니다. 다시 말하지만, 같은 것은 아닙니다.

+0

예, 포인터 유형이 다릅니다. 이제 작동합니다. – xBlue

0

여기에 더 많은 코드를 사용하여 작성할 수는 있지만 ... 저는 이것을 여러분에게 던질 것입니다. 당신은 말했다 :

have some memory and I try to allocate it in several pieces. So I have a linked list. Each node keeps track of the size the allocated piece of memory is and the next node.

그래서 난 당신이 노드를 만들 같은데요, 그리고 malloc() '같은 일을하려고 다음, 그들에게 약간의 메모리를 보내고 :

ptr_to_next_node = ptr_to_current_node+sizeof(node); 

글쎄, 그 아무튼' 일하지 마라. 인접한 메모리가 아니기 때문에 링크 된 목록에서 포인터 연산을 수행 할 수 없습니다.

char array [0][1][2][3] 
      ^^^^ 
      | | | +----------0x86C00004 
      | | +-------------0x86C00003 
      | +----------------0x86C00002    
      +-------------------0x86C00001 

linked_list 

    +-------+  +-------+  +-------+ 
    | node1 |  | node2 |  | node3 | 
    | next---------->| next---------->| next---------->NULL 
    +-------+  +-------+  +-------+ 
    (0x86C0001)  (0x86C000A)  (0x86C00BC) 

OK, 그래서 메모리의 값이 가장 이해가되지 않을 수도 있습니다,하지만 당신은 점을 볼 수 있습니다 포인터 연산이 배열에서 작동하는 이유는 당신이 얻고있는 메모리가 연속 될 것입니다 때문입니다 나는 여기서 설명하려고 노력하고있다. 배열은 sizeof(type)이고, 노드에 할당하는 메모리는 어느 위치 에나있을 수 있습니다. 오프셋을 추가 할 수 없기 때문에 next에 대한 포인터가있는 것입니다.

앞뒤로 건너 뛸 수 있으려면 next과 그 이후의 포인터 prev을 추가해야합니다.

+0

예, 이해합니다. 나는 malloc을 사용하지 않았지만 포인터는 다른 유형이었다. 나는 그것을 고칠 수 있었다. – xBlue