2012-02-24 14 views
5

Dla życia mnie nie mogę zrozumieć dlaczego ja otrzymuję invalid read size of 1 w tym fragmencie kodu, jestem całkiem pewny, że jej coś ze mną zrobić nadużywa char *url pointer ...Valgrind Nieprawidłowy odczytu wielkości 1

char *extractURL(char request[]) 
{ 
char *space = malloc(sizeof(char *)); 
space = strchr(request, ' ')+1; 
char *hostend = malloc(sizeof(char *)); 
hostend = strchr(request, '\r'); 
int length = hostend - space; 
if (length > 0) 
{ 
    printf("Mallocing %d bytes for url\n.", length+1); 
    char *url = (char *)malloc((length+1)*sizeof(char)); 
    url = '\0'; 
    strncat(url, space, length); 
    return url; 
} 
//else we have hit an error so return NULL 
return NULL;  
} 

błąd valgrind jestem coraz to:

==4156== Invalid read of size 1 

==4156== at 0x4007518: strncat (mc_replace_strmem.c:206) 

==4156== by 0x8048D25: extractURL() 

==4156== by 0x8048E59: processRequest() 

==4156== by 0x8049881: main() 

==4156== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

Czy ktoś „punkt” mnie we właściwym kierunku?

+0

Przydzielacie pamięć dla adresu url, a następnie ustawiacie ją na zerowy wskaźnik. (url = '\ 0';) Czy miałeś na myśli ustawienie adresu url [0] = '\ 0'; ? – Joe

+0

Czy może po prostu chcesz używać strncpy? – Cascabel

+0

Masz również wycieki pamięci z twoimi pierwszymi dwoma wywołaniami 'malloc', które zresztą same są całkowicie fałszywe, dlaczego miałbyś zarezerwować' sizeof' o rozmiarze 'char' * wskaźnika *? Twój trzeci "malloc" również wykazuje oznaki potencjalnego zamieszania: (1) nie rzucaj zwrotu 'malloc', to tylko ukrywa błędy (2)' sizeof (char) 'z definicji jest' 1', liczba którą mijasz do 'malloc' jest liczbą' char', którą chcesz przydzielić. –

Odpowiedz

8

Tutaj

char *url = malloc((length+1)*sizeof(char)); 
url = '\0'; 
strncat(url, space, length); 

natychmiast stracić pamięć malloced ustawiając url do NULL. Zauważ, że '\0' ma wartość 0, która jest zerową stałą wskaźnika. A następnie próbujesz coś zrobić z nieprawidłową lokalizacją pamięci.

Prawdopodobnie oznaczało ustawić

*url = '\0'; 

tam.

+0

Który następnie prowadzi do strncat, wykonując skok warunkowy na niezainicjowanej wartości, ale czy tak nie jest? – DMcB1888

+0

Cóż, właściwie oczekiwałbym segfaulta podczas wywoływania 'strncat (NULL, coś, n)', ale valgrind mógłby to zgłosić, jeśli woli. –

Powiązane problemy