2015-06-06 73 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