2012-02-24 14 views
5

のサイズを読んValgrindは無効には、私が...その私が<code>char *url pointer</code>を乱用とは何かを持ってかなり確信している私は、このコードスニペット用<code>invalid read size of 1</code>を取得していますなぜ私はうまくカント私の人生のために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;  
} 

私は取得していますvalgrindのエラーは次のとおりです。

==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 

ことができます右方向に誰か「ポイント」を私に?

+0

あなたはurlのためにメモリを割り当て、それをヌルポインタに設定します。 (url = '\ 0';)おそらくurl [0] = '\ 0'を設定することを意味しましたか? ? – Joe

+0

おそらくstrncpyを使いたいですか? – Cascabel

+0

また、最初の2回の 'malloc'呼び出しでメモリリークが発生しますが、それは完全に偽であり、' size'を 'char' *ポインタ*のサイズに予約するのはなぜですか?あなたの3番目の 'malloc'は潜在的な混乱の兆しも見せます:(1)mallocの返り値をキャストせず、これはバグを隠すだけです。(2)sizeof(char)は定義通りに1です。 'malloc'は割り当てたい' char'の番号です。 –

答えて

8

ここ

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

すぐNULLurlを設定することで、mallocで割り当てられたメモリを失います。 '\0'は0であり、これはヌルポインタ定数です。そして、あなたはstrncat何かを無効なメモリ位置にしようとします。

おそらくそこ

*url = '\0'; 

を設定するためのもの。

+0

これは、strncatが非初期化された値に対して条件付きジャンプを実行することになりますが、そうではありませんか? – DMcB1888

+0

さて、実際に 'strncat(NULL、something、n)'を呼び出すときにはsegfaultが期待されますが、もしvalgrindがそれを報告するかもしれません。 –

関連する問題

 関連する問題