2012-10-01 120 views
-1

可能重複:
Segmentation Fault when trying to use scanf on a structC指針,指向分割故障

我是新來的C語言編程,並有下面的代碼。

char *s; 
scanf("%s",s); 
printf("This is s %s",s); 

上述代碼行導致Segementation Fault。你能解釋爲什麼嗎?是否有一些文章能讓我更深入地理解這些概念?

+1

我們很多年做C,但你可以嘗試,也許用char * s =(char *)malloc(sizeof(char)* 30)替換'char * s;';'?這應該讓's'指向一個允許30個字符的緩衝區。在你的最後一行之後,寫下'free(s);',這將釋放任何資源,正如@chris所指出的那樣。 – npinti

+3

什麼讓你覺得你擁有隨機未初始化的內存,只要's'碰巧指向哪裏? – chris

+0

檢查我剛剛鏈接的問題 - 您需要爲要讀入的字符串分配空間。 –

回答

1

您可以寫入內存地址擁有該特定實體

對於如:

char s[10]; 

存儲爲s10字符所需的編譯器儲備足夠的內存,你可以自由地寫它。

當你說:

char *s; 

指針s只是點到未擁有或爲它保留了一些隨機的內存地址。寫入該內存地址會導致寫入其他實體擁有的內存。從技術上講,這是未定義的行爲
實際上,段錯誤可能發生或不發生,具體取決於寫入的存儲器地址是否屬於某個其他實體。所以你很幸運得到了引起你注意的崩潰。無論如何,這是未定義的行爲,因此應該始終避免。

您需要爲指針分配內存以便能夠使用任何有意義的內存。它是堆棧或堆上的內存,但它應該是擁有的,因此它們都可以寫入。

+0

感謝您的幫助。 –

+0

任何技術推理,這downvote非常讚賞或者只是你的狗吠叫聲太大? –

0

指針存儲地址。 ,並且該地址應始終爲某些保留內存的地址。

表示做完char *s之後。您需要使用malloccalloc來預留/分配一些內存。

char *s=malloc(10*sizeof(char)); 

假設char的大小爲1個字節,這將分配10個字節的內存。 記住您需要free您的目的完成後,您使用免費功能分配的內存。

0

你已經創建了一個指針,但是現在它沒有初始化(可能指向你沒有權限訪問的地方)。

char *s; 

要麼聲明它作爲數組

char s[20]; //this number should be big enough to hold the input 

或者分配一些存儲器中,然後指向它。

char *s = (char *) malloc (20*sizeof(char)); 

參見:scanf

1

用數組和指針的使用與fgets試試這個:

static void get_input() 
{ 
    /* Array of 32 btyes long - no input can be 32 characters in total */ 
#define CHAR_SIZE 32 
    char str_array[CHAR_SIZE]; 
    char *str_ptr = calloc(sizeof(char), CHAR_SIZE); 

    /* Get input from user - limit the input to 32 bytes using fgets which is safer */ 
    printf("Please enter something: "); 
    /* Clear the memory before using it */ 
    memset(str_array, 0, CHAR_SIZE); 
    fgets(str_array, CHAR_SIZE, stdin); 
    printf("The input was [ %s ]\n", str_array); 

    /* Doing the same thing with a pointer */ 
    printf("Please enter something again: "); 
    fgets(str_ptr, CHAR_SIZE, stdin); 
    printf("The input again was [ %s ]\n", str_ptr); 

    /* free memory */ 
    free(str_ptr); 
} 

希望它能幫助,

+0

感謝您的幫助。 –