2017-11-10 4 views
-2

파일에서 읽은 항목의 포인터 배열이 있습니다. 이 항목은 typedef structs입니다.포인터 배열을 다시 반복 할 수 없습니다.

파일에 많은 항목이 포함되어 있으므로 배열의 크기를 조정할 수 있습니다.

while (fscanf(fp, "%X %[^\n]", &code, string) != EOF) { 
    if (list->length >= list->capacity) { 
     list->capacity *= 2; 
     list->items = (Item**)realloc(list->items, 
      list->capacity * sizeof(Item*)); 
    } 
    item.code = code; 
    strcpy(item.string, string); 
    list->items[list->length++] = &item; 
} 

list 가정 및 item 이미 선언됩니다. 공간은 목록에 대해 malloced입니다.

static List * list; & Item item = { 0, { 0 } };

선언 이전 코드에서 초기화됩니다. list은 필요에 따라 전역 변수입니다.

내가 예를 들어 첫 번째 값을 얻기 위해 시도하여이 완성 목록을 반복하려고하면 :

printf("line %d: %X\t%-89s\n", 1, list->items[0]->code, list->items[0]->string); 

내가이에서 파일의 마지막 요소를 얻을 것이다. 그러나 위의 while 루프에이 printf을 포함 시키려면 원하는 콘솔 출력을 얻습니다 (인덱스가 list->length 인 경우).

왜 이러한 유형의 동작이 발생합니까? 포인터를 횡단하는 것을 잊고있는 것이 있습니까?

+3

결코 list->items'realloc과 같은 유형입니다

tmp = realloc(list->items, list->capacity * sizeof *tmp); 

을 :

list->items = (Item**)realloc(list->items, list->capacity * sizeof(Item*)); 

당신이 할 수 있습니다 : 대신 sizeof(type)

sizeof *pointer를 사용하는 그래서 대신도 전형이다 '직접 대상 포인터에 - 항상 temp를 사용하고 NULL을 확인하십시오. – 4386427

+5

포인터를 ** 같은 ** 항목은 항상! 매 반복마다'malloc' * new *'Item '을 사용하지 않습니까? 빨간색, 초록색 및 노란색 셔츠를 연속적으로 착용하는 경우 색상이 무지개 인 3 명이 없으며 노란색 셔츠를 착용하고 계십니다. –

+1

'List'와'Item'이 선언되는 방법을 보여줄 필요가 있습니다. 'Item'과'Item *'사이에 엉망이되고있는 것 같습니다 – 4386427

답변

1

item은 자동 Item 개체로 사용되므로 list->items 배열에 동일한 Item 개체에 대한 포인터가 채워진 것처럼 보입니다.

아마도 각 루프에 새로운 Item이 필요합니다. 마찬가지로 :

Item* newItem; 
while (fscanf(fp, "%X %[^\n]", &code, string) != EOF) { 
    newItem = malloc(sizeof *newItem); 
    if (!newItem) exit(1); 

    if (list->length >= list->capacity) { 
     list->capacity *= 2; 
     list->items = (Item**)realloc(list->items, // BTW DONT DO THIS - SEE BELOW 
      list->capacity * sizeof(Item*)); 
    } 
    newItem->code = code; 
    strcpy(newItem->string, string); 
    list->items[list->length++] = newItem; 
} 

BTW : C에서는 정상적으로 castmalloc/realloc/calloc하지 않는 것이 좋습니다 : 또한

tmp = realloc(....); 
if (tmp == NULL) 
{ 
    // error handling 
} 
else 
{ 
    list = tmp; 
} 

: 항상 realloc 같은 TMP 포인터. tmp

+0

또한'realloc'의 반환을 주조하지 말라는 메모를 남깁니다. 참고 : [** malloc의 결과를 캐스팅합니까 **] (http://stackoverflow.com/q/605845/995714) ('realloc'과'calloc'에도 동일하게 적용) –

+0

@ DavidC.Rankin I 이미 그것에 대해 의견이 있지만 지금은 좀 더 명확하게하려고 노력했습니다. – 4386427

+0

그렇다면 어떻게하면 임시 직원을 해제 할 수 있습니까? – compolo

관련 문제