You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:28:12