Ubuntu 20.04下VS Code运行C程序遇stack smashing detected错误排查
问题分析与修复方案
首先看你遇到的stack smashing detected错误,这是典型的数组越界访问导致栈内存被破坏,咱们一步步拆解代码里的问题:
1. scanf参数的致命错误
你的代码里写了:
scanf("%s",&name[10]);
这里有两个严重问题:
name是长度为10的字符数组,合法下标范围是0到9,name[10]已经超出数组边界,属于非法内存地址,往这里写数据直接破坏了栈结构。%s格式符要求传入字符数组的首地址,数组名name本身就代表首地址,完全不需要加取地址符号&。
正确且安全的写法应该是限制输入长度(留一个位置存字符串结束符'\0'):
scanf("%9s", name);
2. 自定义length函数的冗余与潜在风险
你写的length函数逻辑是对的,但它的功能和标准库的strlen完全一致——都是统计字符串中'\0'之前的字符数。如果不是练习需求,直接用strlen更简洁可靠。
另外要注意:如果字符串没有正确以'\0'结尾,你的length函数会陷入死循环或者计算错误,而之前的越界输入刚好可能导致name数组里没有正确的结束符。
修复后的完整代码
#include<stdio.h> #include<string.h> int main() { char name[10]; printf("Enter name:"); scanf("%9s", name); // 限制输入长度避免溢出 int count = strlen(name); // 直接使用标准库函数 printf("Length: %d\n", count); return 0; }
额外提醒
栈溢出(stack smashing)是系统的保护机制:当你往非法内存地址写数据时,破坏了栈帧的保护信息,系统会直接终止程序防止更严重的内存异常。以后写C语言操作数组时,一定要时刻注意下标范围和字符串结束符'\0',这两个是新手最容易踩的坑。
内容的提问来源于stack exchange,提问作者Trushar Gavit
相关产品推荐
相关产品推荐

