簡體   English   中英

在C語言的字符串中打印字符時出現分段錯誤

[英]Segmentation Fault when Printing Characters in String in C

我正在分配作業,當我嘗試打印字符串的各個字符時,發現我遇到了段錯誤。 這很奇怪,因為刪除打印語句時沒有分段錯誤。

我簡化了分配工作的那部分,從而以更簡單的代碼給了我Seg Fault。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void printword( char **sptr){

    int i;

    for( i = 0; i < 6; ++i){

        printf( "%c\n", *sptr[i]);
    }
}

int main(){

    char *sentence = "This is my sentence\n";

    printf("Sentence is: %s", sentence);
    printword( &sentence );

}

當我運行此代碼時,僅打印第一個字母,然后緊跟在“?”之后 然后是“細分錯誤:11”。 看來我可以從字符串中打印任何字符,但是,在出現段錯誤之前,我只能限制一個字符。 我不明白為什么這是個問題,因為我只是在打印。

這是一個優先問題。 *sptr[i]解析為*(sptr[i]) ,但您需要(*sptr)[i]

它崩潰,因為sptr[i]是指*(sptr + i)即在i = 0 ,你只是簡單地提領sptr (給你sentence ),然后提領的是,給你*sentence (即第一個字符sentence )。 但是在i = 1您正在執行sptr[1] (即*(sptr + 1) ),該嘗試嘗試訪問sentence變量旁邊的內存,然后將其視為另一個取消引用的指針。 即使您很幸運,並且內存中的sentence旁邊恰好有一個有效的指針,連續的迭代也將嘗試取消引用越來越多的垃圾值作為指針。

當然,您可以通過讓printword取一個char *並簡單地將sentence傳遞給它來避免整個問題。

典型的新C程序員會犯錯誤,認為*str[i]str[][i]相同,不是* str[i][0]

那么,為什么會這樣呢? 當您查看優先級時, []位於頂部。 看看這個

另一種查看方式是:

arr[i][j]

是這樣的:

*(*(arr+i) + j)

因此*str[i]就像:

**(arr + i)

您想要的是:

*(*(arr) + i)

就像:

*(arr[i])

我希望這有幫助!!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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