[英]segmentation fault in C assign string to char
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a="9jhjhi";
printf("%s",a);
}
為什么這會引發細分錯誤? 屏幕后面會發生什么?
您需要使用char *a = "..."
。
傳遞%s
時, printf
將通過字符串查找0
/ NULL
字節。 在你的情況你是不是指定一個字符串來a
,而實際上你的編譯器應該扔了你試圖初始化警告char
從一個指針。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a="9jhjhi";
printf("%s",a);
}
你的錯誤是
char a="9jhjhi";
應該
char *a="9jhjhi";
發生的是未定義的行為-因此任何事情都可能發生。
您將字符串文字分配給char,因此a
將包含一個指針(指向該字符串的開頭),該指針將轉換為char-無論如何。
printf中的%s
轉換假定您向其傳遞了一個字符串,該字符串必須是char *,它指向以0終止符結尾的字符序列。 您為它傳遞了一個char,它肯定不滿足那些要求,所以將要發生的事情是非常不確定的-崩潰很常見。
您還應該從main()方法返回一些內容-聲明它畢竟要返回一個int值。
C沒有字符串b = new String();
C具有char類型的數組。
因此char a =“ 123123”應該是一個字符數組。
您也沒有在該代碼中使用stdlib.h中的任何內容,因此沒有理由#include它。
編輯:是的,也沒有說什么。 數組名稱是一個指針。
a
初始化為一個指向char數組(可能在ROM中的某個位置)的指針(將其轉換為整數,並由於char
太小3或7個字節而被截斷)。 接下來的內容是未定義的,但可能是這樣的:當您將它傳遞給帶有格式字符串中的%s
printf
時,它將從堆棧中獲取a
(在0-255
)和3(或7)個無關字節的值。 ,獲取一些虛假的地址,並通過訪問別人的記憶來發ha。
使用char *a = ...
你的意思是
char *a = "9jhjhi";
如果編譯時沒有警告,則說明您的編譯器設置被弄亂了。 來自gcc的警告清楚地表明了正在發生的事情:
test.c: In function ‘main’:
test.c:5: warning: initialization makes integer from pointer without a cast
test.c:6: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
字符串文字被解釋為一個指針,該指針被轉換(並被截斷)為char
。
然后,將char
作為數字發送到printf
,但將其解釋為字符串。 由於它絕不是以Null結尾的,因此在通過該“字符串”進行競爭時, printf
可能會超出內存。
當聲明不帶指針符號的char a
,您僅在堆棧上為單個字符分配了足夠的空間。
在C字符串由代表char
陣列,或一個指向一個char
陣列,由空字符結束'\\0'
。 但是,如果您使用文字字符串,則編譯器會為您處理所有這些工作。
這是使代碼正常工作的方法,然后:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a = "9jhjhi";
printf("%s",a);
}
首先,您試圖將整個字符串保存到單個char變量中。 請改用char數組(char [size])。 您可能還想以“ \\ 0”終止字符串。
您可以通過兩種方式消除此錯誤。
1.char * p =“ karthik A”
2.char [] p =“ karthik A”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.