簡體   English   中英

C中的分段錯誤將字符串分配給char

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM