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

C语言中向函数传递字符串数组参数出现段错误求助

解决字符串数组传递时的段错误问题

你的代码出现段错误主要有两个关键问题,咱们一步步拆解:

1. 未初始化的指针数组元素

你声明了char *str[2];,这是一个包含2个字符指针的数组,但这些指针没有指向任何有效的内存空间。当你用scanf("%s", (str+i))的时候,相当于把输入的字符串直接写入一个随机的内存地址(野指针指向的区域),这必然会触发段错误——操作系统不允许程序访问未授权的内存。

2. 函数未提前声明

display函数在main函数之后定义,但你没有在main之前声明它。虽然这不一定直接导致段错误,但这是C语言的标准错误,编译器会默认它返回int类型,可能引发未定义行为。


修复后的代码(动态内存版本)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// 提前声明display函数,让编译器知道它的参数和返回类型
void display(char **p);

int main() {
    char *str[2];
    // 为每个指针分配足够的内存,这里假设每个字符串最多100个字符
    for(int i=0;i<2;i++) {
        str[i] = malloc(101 * sizeof(char)); // 多留1个位置存字符串结束符'\0'
        if(str[i] == NULL) {
            perror("malloc failed");
            return 1;
        }
        scanf("%s", str[i]); // 直接用str[i],比(str+i)更直观
    }
    display(str);
    
    // 别忘了释放分配的内存,避免内存泄漏
    for(int i=0;i<2;i++) {
        free(str[i]);
    }
    return 0;
}

void display(char **p) {
    for(int i=0;i<2;i++) {
        printf("%s \n",p[i]);
    }
}

关键修复点说明

  • 为指针分配内存:用malloc给每个字符串指针分配足够的空间,这里设的是101个字符(包含结束符),你可以根据实际需求调整大小。同时要检查malloc是否成功,避免分配失败后继续操作。
  • 提前声明函数:在main之前声明display,让编译器明确它的类型信息。
  • 释放内存:使用完动态分配的内存后,用free释放,避免内存泄漏。

另一种方案:固定大小二维数组

如果你不想用动态内存,也可以直接声明二维字符数组,这样每个字符串都有固定的内存空间,也能避免野指针问题:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// 注意参数类型是指向数组的指针
void display(char (*p)[101]);

int main() {
    char str[2][101];
    for(int i=0;i<2;i++) {
        scanf("%s", str[i]);
    }
    display(str);
    return 0;
}

void display(char (*p)[101]) {
    for(int i=0;i<2;i++) {
        printf("%s \n",p[i]);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:03:45