C语言函数传数组指针出现stack smashing detected报错求助
问题原因分析
- 核心错误出在
main函数中调用einmaleins时的参数传递错误:你定义的arr是长度为10的int数组,合法下标范围是0~9,你传递的&arr[10]是数组最后一个元素之后的非法地址,完全没有指向数组的有效存储区域。 einmaleins函数中收到这个非法地址后,循环向arr[i-1]写入数据时,相当于直接覆盖了数组后方的栈内存区域,破坏了栈的保护校验结构,因此触发了stack smashing detected的栈溢出报错。
修复方案
只需要修改main函数中调用einmaleins的参数,传递数组的首地址即可,有两种等价的写法:
- 直接传递数组名
arr,C语言中数组名作为参数传递时会自动退化为首元素指针 - 显式传递首元素地址
&arr[0]
修正后的完整代码
int einmaleins(int zahl, int *arr){ int e; for(int i = 1; i<11; i++){ e = zahl*i; arr[i-1]=e; } return 0; } int main(){ int arr[10] = {0}; // 修正参数为数组首地址 einmaleins(2, arr); return 0; }
内容的提问来源于stack exchange,提问作者kaan5353
相关产品推荐
相关产品推荐

