[英]recieving signal SIGSEGV segmentation fault
#include<stdio.h>
#include<conio.h>
int main()
{
int i, j, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
modify();
for (i = 0; i<10; i++)
{
printf("Origional Array is:");
printf(" %d\n", array[i]);
}
modify(array);
for (i = 0; i<10; i++)
{
printf("New Array:");
printf("%d\n", array[i]);
}
system("pause");
}
modify(int array[10])
{
int j;
for (j = 0; j<10; j++)
{
array[j] = array[j] * 3;
}
return array[j];
}
沒有編譯時錯誤...但在運行時這顯示信號 sigsegv 分段錯誤。 請幫我...!
[請注意,此答案假定代碼實際上是 C 而不是 C++]
您的代碼存在一些問題。
拳頭是這樣的:
modify();
在您告訴編譯器它存在之前,您在這里調用該函數。 顯然,您的編譯器說沒關系,但事實並非如此。 可能發生的事情是編譯器推斷(“猜測”的花哨詞)該函數不接受任何參數並且不返回任何內容。 即聲明看起來像
void modify(void);
這種“猜測”在舊的 C 標准中是允許的,但是由於 C99 標准,這個隱式聲明被刪除了,並且會在兼容的編譯器中給你一個錯誤。
稍后你做
modify(array);
它再次調用該函數,但由於編譯器認為該函數不接受任何參數,因此實際上不會傳遞任何參數。 這導致了最糟糕的問題:在實際的modify
函數中,您使用了一個參數,但由於實際上沒有傳遞任何變量,因此不會初始化該變量,並且您將有未定義的行為試圖取消引用該指針(數組在作為傳遞時衰減為指針)函數的參數),你很可能會在那里崩潰。
還有從函數返回:
return array[j];
這里j
的值將是10
,這超出了您傳遞(好吧,嘗試傳遞)到函數的數組的范圍。
為了解決這個問題,在調用函數之前的某處添加函數原型聲明,通常的地方是在main
函數之前的全局范圍內。 就像是
...
int modify(int *array);
int main(void)
{
...
}
...
並修復函數中的return
語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.