2016-11-30 124 views
-6
字符串

例1: 當我走串輸入,它成功地給出了輸出,寫這一段代碼:的printf的意外的輸出在C

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",&str); 
    return 0; 
} 

情況2: 。另一方面,它拋出一個運行時錯誤的這個片段:

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",str); 
    return 0; 
} 

我發現這個奇特的東西,想知道爲什麼會發生? 在此先感謝。

+5

閱讀** **字符串,** **指針,數組** **和**動態內存分配**以及**格式說明**。通過閱讀關於*未定義的行爲*,在蛋糕上添加櫻桃。 – haccks

+1

這裏的東西缺少記憶,那就是'str'。 –

+0

除了你沒有爲'str'分配內存,情況2是正確的實現。在使用之前添加一個'str = malloc(50);'或類似的東西。在情況1中你幸運,只是爆炸一些不屬於你的記憶。 – eddiem

回答

2

這兩種情況都不是正確的。

案例1只工作,因爲你有幸運,可能通過給一個字符串作爲輸入。試試類似"bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja",你很可能會遭遇seg故障。

您應該有一個與str關聯的內存塊,或者在堆棧上爲它聲明一個數組,或者在堆上爲它存儲內存塊malloc

而且您不應該使用&運算符。

因此,這將是這樣的:

#include <stdio.h> 
int main() 
{ 
    char str[50]; // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    return 0; 
} 

或像這樣:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char* str = malloc(50); // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    free(str); 
    return 0; 
} 
+0

非常感謝@YuriLaguardia –

+0

@yano哎呀。絕對! – yLaguardia

+0

對不起@yano。我是StackOverflow的新手,所以不太習慣它。我感謝你與我分享正確的代碼:) –