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