伊莉討論區

標題: 除錯時出現您的程式出現存取違規錯誤(segmentation fault) [打印本頁]

作者: 0203650    時間: 2012-2-21 11:10 PM     標題: 除錯時出現您的程式出現存取違規錯誤(segmentation fault)

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

main()
{
      int i=868,*p=&i;
      int j;
      int *q;
      char *a="12345";
start:
      system("cls");
      j=737;                              
      *q=j;                    //執行到這就有問題了                          
      p r i n t f("\n&p=%p   p=%p   *p=%d\n",&p,p,*p);
      p r i n t f ("\n&q=%p   q=%p   &j=%p   *q=%d\n",&q,q,&j,*q);
      p r i n t f ("\nsizeof(p)=%d   sizeof(q)=%d   sizeof(a)=%d\n\n\n",sizeof(p),sizeof(q),sizeof(a));
eoj:
      system("pause");
      goto start;
}
-------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int str_len(char *str),str_cpy(char *take,char *give);
main()
{
      int len;
      char *str,cpy[]="copied string", *p=cpy;
start:
      p r i n t f ("\n請輸入一組字串:");
      fflush(stdin);
      gets(str);                    //執行到這就有問題了   
      p r i n t f ("\n字串 %s 其長度為:%d bytes.\n",str,str_len(str));
      str_cpy(p,str);
      p r i n t f ("\n複製後字串 %s \n",cpy);
exit:
      p r i n t f ("\n");
      system("pause");
      goto start;
}

int str_len(char *p)
{
      int i=0;
      while(*(p+i)!='\0')
      {
            i++;
      }
      return i;
}
int str_cpy(char *take,char *give)
{
      int i;
      for(i=0;i<=str_len(give);i++)
      {
            *(take+i)= *(give+i);
      }
}
-------------------------------------------------------------------------------------------------------
以上兩個練習用的程式,執行除錯時就會顯示:您的程式出現存取違規錯誤 (segmentation fault)
不知道程式是哪裡寫得有問題
初學者,還希望各位指導指導





作者: iseeyou    時間: 2012-2-22 09:59 AM

str 沒有空間配置給他.
作者: ILOVEYOUEVER    時間: 2012-2-22 10:11 AM

他不讓我直接回覆
自己下載添加附件吧
作者: 0203650    時間: 2012-2-22 10:31 AM

本帖最後由 0203650 於 2012-2-22 10:37 AM 編輯

您說的 q = &j; ,有用過,是 ok 的
但奇怪的是,書裡的居然是可以正常執行,但實際上我執行程式就會當掉...
照他範例程式那樣寫的話,是屬於哪裡有問題?
q = &j;  <--- 將 j 的記憶體位址存放至 q ,這樣解釋有錯嗎?
那原程式 *q = j;   <--- 這要怎麼解釋?   將 q 指向 j 的位址?   還是...這樣寫本身就有問題?

-----------------------------------------------------------------------------------

那請問第二個程式是需要改哪裡呢?






作者: ILOVEYOUEVER    時間: 2012-2-22 08:40 PM

解釋上出錯,解釋上應該是
q這個記憶體位置指向j
作者: iseeyou    時間: 2012-2-23 01:55 PM

你卻定你的書是這樣子寫的demo 嗎?
*q=j;    , 在使用 *q 之前沒有把q 設定到正確的空間嗎.
如果書這樣子寫.. 那本書可以丟了不要看了 ..

你的程試1, 2 都犯了一樣的錯誤. 使用指標前. 沒有給定正確的空間.
example
int *q;
int p;
*q=100; // error ..  q 沒有指到正確的空間, 就企圖使用他
q=&p;  // 把p 變數所在的address 設給q
*q=100; // ok  寫入100 到q 所指向的空間
作者: 0203650    時間: 2012-2-23 04:12 PM

iseeyou 發表於 2012-2-23 01:55 PM
你卻定你的書是這樣子寫的demo 嗎?
*q=j;    , 在使用 *q 之前沒有把q 設定到正確的空間嗎.
如果書這樣子 ...

書上的 Demo 確實是這樣寫的....

那能請教正確的寫法為何
能否把兩個程式有錯誤的地方點出來,好讓我知道錯在哪,也好學習學習?
要如何修改才能讓兩個程式正確編譯
作者: EdisonX    時間: 2012-2-24 01:43 AM

0203650 發表於 2012-2-23 04:12 PM
書上的 Demo 確實是這樣寫的....

那能請教正確的寫法為何

針對第一個問題,
如果你的書是那樣寫的話,該換本書了。
這是初學常犯的問題,解決方案已於點評中指出,
pointer 、memory address、 value 觀念上之建立需花久一些時間,
此處不再贅述。

>> q = &j;  <--- 將 j 的記憶體位址存放至 q ,這樣解釋有錯嗎?
沒錯,所以 q 指的位址 ( q 存放的內含值) 就是變數 j 的位址。

>> *q = j;   <--- 這要怎麼解釋?   將 q 指向 j 的位址?   還是...這樣寫本身就有問題?
這樣寫會有問題,*q 動作,是去 q 裡面看「存哪個位址」,再對該位址做操作。
但是 q 現在沒有存任何變數的位址值,所以 *q 會不知道指到哪去,進而造成錯誤。
很亂的話這裡跳過,先別考慮這行,只要知道正確是上面的寫法就行。



第二個問題,

char* str ;
char str[200];
char *str = "edisonx" ;
char str[] = "edisonx";

這四種情況請不要混為一談,只要是 char* str ,
就只能「唯讀」,而不能去更改其內含值,
會更改到的話就該用

char str[200] = "edisonx";

之類的。一個是陣列,一個是指標,有些情況可相通,但並不代表完全相同。
又很亂的話再把結論記下來

字串只要有機會更改其內含值,就要以陣列型態宣告,
不該以指標型態宣告。




歡迎光臨 伊莉討論區 (http://wwwaaa.eyny.com/) Powered by Discuz!