2017-05-09 4 views
0

struct MotInfo** 안에 다시 할당하려고합니다. 이것은 나를 만든 구조체입니다. 내가하려고 할 때하지만 오류가 내 realloc :오류 : realloc() : 유효하지 않은 포인터

int x; 
    MotInfo** hashtable = malloc(TAILLE*sizeof(struct MotInfo*)); 
    for(x=0; x<TAILLE;x++) 
    { 
     hashtable[x] = NULL; 
    } 
    struct MotInfo* mot_info; 
    int i; 
    hashtable[5] = malloc(sizeof(struct MotInfo*)); 

    mot_info = malloc(sizeof(struct MotInfo*)); 
    mot_info->mot = "manger"; 

    mot_info->urls = malloc(2*sizeof(char*)); 
    mot_info->occurrences = malloc(2*sizeof(int)); 
    mot_info->taille = 2; 
    for(i = 0;i<2;i++) 
    { 
     mot_info->urls[i] = "http://stackoverflow.com/questions"; 
     mot_info->occurrences[i] = 3; 
    } 
    printf("OK\n"); 
    hashtable[5] = mot_info; 
    hashtable[5]->urls = realloc(hashtable[5]->urls, sizeof(char*)*2); 

내가 마지막 줄에 내 오류를 지역화,하지만 난이 오류가 :

realloc(): invalid pointer: 
+2

'해시 테이블 [5] -> urls' 이전에'malloc' 또는'에 의해 반환 된 일부 쓰레기 값 대신 포인터를 포함합니다 realloc' 또는 NULL을 리턴합니다. –

+1

'MotInfo'의 구조 정의를 제공합니다. – Cherubim

+0

@lurker'mot_info-> urls = malloc (...)'에 이어'hashtable [5] = mot_info'가옵니다. – Barmar

답변

4
struct MotInfo* mot_info; 
mot_info = malloc(sizeof(struct MotInfo*)); 

mot_infostruct MotInfo에 대한 포인터입니다 그러나 할당하는 공간은 구조체가 아니라 포인터를 보유하기에 충분합니다 (적어도 네 명의 멤버가 있으므로 더 커질 수 있습니다). 할당을 초과 할 때 malloc의 부기를 밟을 수 있습니다.

hashtable[5] = malloc(sizeof(struct MotInfo*));  // (a) 
mot_info = malloc(sizeof(struct MotInfo*)); 
hashtable[5] = mot_info;        // (b) 

(b)에 할당 블록에 대한 포인터를 해당 손실의 할당은 (a).

mot_info->urls = malloc(2*sizeof(char*)); 
hashtable[5] = mot_info; 
hashtable[5]->urls = realloc(hashtable[5]->urls, sizeof(char*)*2); 
나도이 이해가 안

, 당신이하지 않은 realloc 같은 크기로 보내고?

반환 값이 realloc 인 경우에도 동일한 포인터에 즉시 할당하면 안됩니다. realloc이 실패하면 메모리 블록에 대한 포인터가 손실됩니다.

+0

나는 더 큰 코드에서 가지고있는 것과 같은 에러를 복제했다. 그러나 나의 해시 테이블 [5] -> urls가 더 커야한다. 이것이 내가 realloc을 사용하는 이유이다. 내 URL에 더 많은 공간이 필요하다. –

0

당신은 당신이 아마 할 것 있도록 hashtable[5] = malloc(sizeof(struct MotInfo*))하지만 hashtable[5]는 자체 struct MotInfo에 대한 포인터입니다했다 hashtable[5] = malloc(sizeof(struct MotInfo))

+1

"deferenciated"isn ' 한 마디. – Barmar

+0

네, 죄송합니다. 나쁜 번역이었습니다. 나는 바로 잡을 것입니다. –