2014-12-03 21 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

相关问题