接收信号SIGSEGV分段故障

时间:2016-05-09 18:44:38

标签: c++ sigsegv

#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分段错误。 请帮帮我......!

1 个答案:

答案 0 :(得分:1)

[注意,这个答案假定代码实际上是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语句。