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