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

使用strstr函数在二维数组中查找一维子串时程序崩溃的原因及解决方法

问题分析与修复方案

咱们来一步步拆解你代码里的问题,以及对应的修复方法:

崩溃的核心原因

你的程序崩溃主要源于两个严重问题:

  • 数组越界访问:你定义的twodarray二维数组只初始化了2个字符串("This is a"和"2D Array"),所以它只有2行有效数据,索引范围是0和1。但你调用strstr(twodarray[20], onedarray)时直接访问了第20行,这完全超出了数组的内存边界,操作系统会直接终止程序,这就是崩溃的根源。
  • 位置计算逻辑错误:就算成功找到子串地址,用(int)pa-(int)onedarray计算位置也是完全错误的——你应该用子串地址减去当前行的起始地址,才能得到子串在该行内的偏移位置,而不是减去目标子串自己的地址。

修复后的代码及说明

下面是修正后的代码,解决了上述问题,还增加了未找到子串的容错逻辑:

#include<stdio.h>
#include<string.h>
int main() {
    char twodarray[][20]={"This is a","2D Array"};
    char onedarray[]={"Array"};
    char *pa;
    int position;

    // 遍历二维数组的每一行(仅2行有效,索引0和1)
    for(int i = 0; i < 2; i++){
        pa = strstr(twodarray[i], onedarray);
        if(pa != NULL){
            printf("找到子串的地址: %p\n", pa);
            // 计算子串在当前行的偏移位置
            position = pa - twodarray[i];
            printf("子串在第%d行的起始位置(偏移量): %d\n", i, position);
        } else {
            printf("第%d行未找到子串「%s」\n", i, onedarray);
        }
    }
    return 0;
}

关键改进点

  1. 彻底避免越界:通过循环遍历数组的有效行(0和1),再也不会访问不属于数组的内存区域。
  2. 增加空指针判断:每次调用strstr后先检查返回值是否为NULL,防止后续对空指针的操作引发额外问题。
  3. 正确计算位置:用pa - twodarray[i]计算偏移量,这个值代表子串在当前行字符串中的起始位置(从0开始计数,比如在"2D Array"中,Array的偏移量是3)。

内容的提问来源于stack exchange,提问作者user8753900

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:48:20