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