繁体   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