2013-08-10 3 views
0
typedef struct { 
    long blarg; 
} item; 

typedef struct 
{ 
    item* items; 
    int size; 
} list; 

목록 및 항목 구조체는 매우 간단합니다.C 동적 목록 문제

list l; 
l.size = 3; 
realloc(l.items, l.size*sizeof(item)); 

목록을 작성하여 3 개의 항목을 포함하도록 할당하십시오. 를 인쇄 할 때

item thing; 
item thing2; 
item thing3; 

thing.blarg = 1337; 
thing2.blarg = 33; 
thing3.blarg = 123; 

l.items[0] = thing; 
l.items[sizeof(item)+1] = thing2; 
l.items[(sizeof(item)*2)+1] = thing3; 

일부 항목을 작성하고이 목록에 추가 ...하지만 :

printf("List 0: %ld\n", l.items[0].blarg); 
printf("List 1: %ld\n", l.items[sizeof(item)+1].blarg); 
printf("List 2: %ld\n", l.items[(sizeof(item)*2)+1].blarg); 

List 0: 1337 
List 1: 33 { 
List 2: 1953720652 ! 
모든 잘못 않았다

?

+0

'items' 멤버 목록을 구분할 때'sizeof' 연산이 올바르지 않습니다. C에서 포인터 연산에 대해 읽어 볼 것을 제안합니다. 컴파일러는 인덱싱되는 포인터의 크기 *에 인덱스 오프셋 요청을 곱한 값에 따라 올바른 바이트 오프셋을 생성합니다. – WhozCraig

+0

realloc 된 것에 realloc 호출의 값을 할당 할 필요가 없습니까? – user2357112

+0

사실, 크기를 조정하기 전에 먼저 어떤 저장소를 malloc 할 필요가 없습니까? – user2357112

답변

1

당신은 l.items[sizeof(item)+1] 변경해야하고 l.items[(sizeof(item)*2)+1] ->l.items[1]

+0

이렇게하면 첫 번째와 두 번째 항목을 올바르게 출력하지만 세 번째로 "{"를 출력합니다. –

+0

@SuperDisk는 인덱스 [0], [1] 및 [2] *** 만 사용하고 있습니다 (sizeof 또는 곱셈 필요 없음). – WhozCraig

+0

@WhozCraig 예. –

0
realloc(l.items, l.size*sizeof(item)); 

l.items[2] 그냥 l.size을 alloced있다 (즉, 3) 항목 요소, 하면서는 sizeof (항목) +1과는 sizeof (항목) * 2 + 1 l.items 배열의 범위를 초과 한 그래서 알 수없는 값은 읽을 것이며, 당신은 당신이했던 방식으로 l.items를 사용하려면 사실, 세그먼트 오류가 에게 당신을

을 발생한다 l.items를 (void *) firs로 변환해야합니다. t, 그리고 blarg 값을 얻는 동안 item *으로 다시 변환하십시오.