2014-02-09 63 views
0

出於某種原因,此代碼是segfaulting因爲我找不到的原因。這段代碼爲什麼會出現問題? (指針算術)

char *read_line(FILE *fp) 
{ 
    char *out; 
    int counter = 0; 
    char c = getc(fp); 

    while (c != '\n' && c != EOF) 
    { 
     *(out + counter) = c; 
     counter++; 
     c = getc(fp); 
    } 

    if (c == EOF || feof(fp)) 
    { 
     return NULL; 
    } 

    *(out + counter) = '\0'; 
    return out; 
} 

我已經嘗試在gdb運行它,並已經告訴我,段錯誤是在*(out + counter) = c;。我無法弄清楚我做錯了什麼,其他人可以嗎?

+5

似乎char * out沒有初始化? –

+0

我會將它初始化爲什麼? O.o – AppleDash

+0

如果您想要將數據讀取到某處,您需要提供內存來執行此操作。由於目前代碼「out」僅僅是一個無處不在的指針。並寫到它指向的地方,引發未定義的行爲和崩潰。 – alk

回答

6

你沒有給out分配任何值,所以它可能指向一些無效的內存地址。

你可能想要做的是找到數據的長度,然後再分配所需的內存量,然後讀取實際數據到分配的內存:

char *out; 
int counter = 0; 
char c = getc(fp); 
while (c != '\n' && c != EOF) { 
    counter++; 
    c = getc(fp); 
} 

out = malloc(counter+1); 
fseek(fp,0,SEEK_SET); 

counter = 0; 
c = getc(fp); 
while (c != '\n' && c != EOF) { 
    *(out + counter) = c; 
    counter++; 
    c = getc(fp); 
} 
*(out + counter) = 0; 

而且不要忘記到free(out)當你使用它時...

順便說一句,而不是第二個for循環,你可以簡單地使用fgets(out,count,fp)

+0

但是我會賦予它什麼價值? – AppleDash

+2

分配的內存地址;看到更新的答案... –

+1

@AppleDash:42? - ) – alk