2015-06-06 49 views
-1

我已经“包含”任何我能找到的东西,我已经尝试过每一种方式来声明字符串,取消引用字符串,打印字符串,我仍然得到分段故障。我使用的是Ubuntu,并且出现了分段错误,我不知道为什么。我一直在阅读来自printf等字符串声明的每个版本的错误,并且我没有发现任何可行的东西。C,分段错误,通过printf或字符串声明

它甚至不会printf(“test”);

想法?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 


int main(int argc, char **argv) 
{ 
    printf("test"); 
    char *string = "hey dude what's up"; 
    printf("test"); 
    char **strings; 
    char *tempString; 
    printf("test"); 

} 
+1

这里不能重现。你能给我们GDB和/或valgrind的输出吗? –

+1

如果将它改为'printf(“test \ n”),它至少应该是第一个printf;'你是否认识到diff? –

+0

如果还没有,请尝试使用调试器来查明问题。听起来你有一个系统问题,而不是你的代码问题,所以任何人都很难找到它。 – kaylum

回答

0

在发布的代码中,纠正了所有的编译器警告后,留下了下面的内容。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 


int main(void) 
{ 
    printf("test"); 
    printf("test"); 
    printf("test"); 
    return(0); 
} 

哪一个不是seg故障;

记住标准输出由操作系统进行缓冲,直到程序退出或缓冲区(非常大)溢出时才会打印任何内容。

然而,为了使每个 '测试' 字符串立即打印,不论

1) follow each printf() with fflush(stdout) 
or 
2) modify 'test' to 'test\n' 
or 
3) follow each printf() with an input statement, like fgets or getchar or ... 

给出的原始代码:

int main(int argc, char **argv) 
{ 
    printf("test"); 
    char *string = "hey dude what's up"; 
    printf("test"); 
    char **strings; 
    char *tempString; 
    printf("test"); 

} 

任何努力,修改文字,喜欢用的strtok()将导致在seg故障事件中,因为文字在只读内存中

为了使代码更健壮,char指针的'strings'和'tempString'应该初始化为NUL L.

这是一种糟糕的编程习惯,只用尾部的字符串差异'字符串'和'字符串'来命名变量,因为这样的做法可能会成为维护的噩梦。

我会为头文件正在使用(“串”和“串”和“文件string.h”)注意也建议不要变量命名一样:也有一个“strings.h”中以头文件

顺便说一句:原始代码编译时带有警告,链接没有警告,并且没有seg故障事件运行。

或者当然,在程序退出之前,终端没有输出,这是由于stdout的缓冲。

我在运行ubuntu linux 14.04

+0

上述方法是导致seg故障事件的代码中的问题发布的代码 – user3629249