可能重複:
Segmentation Fault when trying to use scanf on a structC指針,指向分割故障
我是新來的C語言編程,並有下面的代碼。
char *s;
scanf("%s",s);
printf("This is s %s",s);
上述代碼行導致Segementation Fault。你能解釋爲什麼嗎?是否有一些文章能讓我更深入地理解這些概念?
可能重複:
Segmentation Fault when trying to use scanf on a structC指針,指向分割故障
我是新來的C語言編程,並有下面的代碼。
char *s;
scanf("%s",s);
printf("This is s %s",s);
上述代碼行導致Segementation Fault。你能解釋爲什麼嗎?是否有一些文章能讓我更深入地理解這些概念?
您可以寫入內存地址擁有該特定實體。
對於如:
char s[10];
存儲爲s
10
字符所需的編譯器儲備足夠的內存,你可以自由地寫它。
當你說:
char *s;
指針s
只是點到未擁有或爲它保留了一些隨機的內存地址。寫入該內存地址會導致寫入其他實體擁有的內存。從技術上講,這是未定義的行爲。
實際上,段錯誤可能發生或不發生,具體取決於寫入的存儲器地址是否屬於某個其他實體。所以你很幸運得到了引起你注意的崩潰。無論如何,這是未定義的行爲,因此應該始終避免。
您需要爲指針分配內存以便能夠使用任何有意義的內存。它是堆棧或堆上的內存,但它應該是擁有的,因此它們都可以寫入。
感謝您的幫助。 –
任何技術推理,這downvote非常讚賞或者只是你的狗吠叫聲太大? –
指針存儲地址。 ,並且該地址應始終爲某些保留內存的地址。
表示做完char *s
之後。您需要使用malloc
或calloc
來預留/分配一些內存。
char *s=malloc(10*sizeof(char));
假設char的大小爲1個字節,這將分配10個字節的內存。 記住您需要free
您的目的完成後,您使用免費功能分配的內存。
你已經創建了一個指針,但是現在它沒有初始化(可能指向你沒有權限訪問的地方)。
char *s;
要麼聲明它作爲數組
char s[20]; //this number should be big enough to hold the input
或者分配一些存儲器中,然後指向它。
char *s = (char *) malloc (20*sizeof(char));
參見:scanf
用數組和指針的使用與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);
}
希望它能幫助,
感謝您的幫助。 –
我們很多年做C,但你可以嘗試,也許用char * s =(char *)malloc(sizeof(char)* 30)替換'char * s;';'?這應該讓's'指向一個允許30個字符的緩衝區。在你的最後一行之後,寫下'free(s);',這將釋放任何資源,正如@chris所指出的那樣。 – npinti
什麼讓你覺得你擁有隨機未初始化的內存,只要's'碰巧指向哪裏? – chris
檢查我剛剛鏈接的問題 - 您需要爲要讀入的字符串分配空間。 –