2014-12-03 46 views
-1

在下面的代碼,當使用時,讀取輸入路徑,讀出在該路徑的文件中的文本,並返回包含從該文件中的所有內容的一個字符串:爲什麼主函數中的段錯誤,而不是外部錯誤?

#include <stdio.h> 
#include <string.h> 
char* readFile(char *path) { 
    FILE *fp; 
    char buff[255]; 

    char *str; 

    fp = fopen(path, "r"); 
    if(fp) { 
     while(fgets(buff, 255, fp)) { 
      strcat(str, buff); 
     } 
     fclose(fp); 
    } 
    return str; 
} 

這下的碼位是相當同樣的事情(修改爲不採取任何輸入)時,只有它不是在一個單獨的文件:

#include <stdio.h> 
#include <string.h> 
int main() { 
    FILE *fp; 
    char buff[255]; 

    char *str; 

    fp = fopen("test.txt", "r"); 
    if(fp) { 
     while(fgets(buff, 255, fp)) { 
      strcat(str, buff); 
     } 
     fclose(fp); 
    } 
    printf("%s\n", str); 
    return 0; 
} 

第二碼位,當我運行它,產生一個分割誤差。

爲什麼這些不同?

+7

這就是[** undefined behavior **](http://en.wikipedia.org/wiki/Undefined_behavior)的工作原理。你試着用'str'來做'strcat'。你在哪裏爲'str'分配內存? – 2014-12-03 21:32:06

+0

我想我通過分配內存不太明白你的意思。我是C的新手,來自JavaScript等高級語言,因此這個術語對我來說是新的。我應該改用'char str []'還是在strcat調用時執行'strcat(&str,buff)'? – SirPython 2014-12-03 23:04:57

回答

2

您從未爲指針分配內存str。然而,想要訪問它的內存並因此失敗(seg故障)。你需要在兩個函數中解決這個問題。它有可能工作有時,當str最初指向一個實際的地址,但這只是重合(它仍然是垃圾數據)。

+0

我對C有點新鮮感。通過分配記憶,你的意思是什麼?當我看到這一點時,我認爲「在定義之前宣佈」。 – SirPython 2014-12-03 22:04:56

+0

或者你的意思是「未分配」,我只是宣佈了一個字符指針,沒有指向它。而不是那個,我應該做'char str []'? – SirPython 2014-12-03 22:10:57

+0

或者,在strcat調用中,不是'char str []',而是在'str *'寫入'strcat(&str,buff)' – SirPython 2014-12-03 22:25:41

相關問題