簡體   English   中英

接收信號SIGSEGV分段錯誤

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

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