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

C语言中如何将函数返回的字符串数组赋值给新数组?代码调试求助

问题分析与解决方案

原代码的核心问题

  1. 返回值错误:questions()函数返回*er,实际只返回了数组第一个元素(即第一个字符串的指针),而非整个字符串数组的指针,导致erts无法拿到完整题库。
  2. 类型不匹配与非法内存访问:main中erts定义为char*,循环里erts[i]取的是单个字符,用%s打印时会把该字符值当作内存地址,触发非法内存访问,这就是程序崩溃、无输出的原因(退出码3221225477对应Windows下的内存访问违规)。

修正代码(传递完整数组)

1. 修改questions()函数的返回类型

将返回类型改为char**(指向字符串指针的指针),直接返回数组名er(数组名会自动退化为指向第一个元素的指针):

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

char** questions(){
    static char* er[10] = {
        "2+2", //ans 4
        "4-5", //ans -1
        "10*10", //ans 100
        "17*3", //ans 51
        "9/3", //ans 3
        "45+24+35-68", //ans 36
        "4-2", //ans 2
        "592-591", //ans 1
        "8+3", //ans 11
        "9*9" //answer 81
    };
    return er;
}

2. 调整main函数的变量类型与逻辑

把erts定义为char**,即可接收完整的字符串数组指针,同时实现随机选取5道不重复题目的需求:

int main() 
{
    int i, idx;
    char **erts;
    int selected[5] = {-1}; // 存储已选题目索引,初始化为无效值
    srand(time(NULL)); // 用当前时间初始化随机数种子,保证每次运行结果不同
    
    erts = questions();
    
    // 随机选取5道不重复的题目
    for(i = 0; i<5; i++){
        do {
            idx = rand() % 10; // 生成0-9的随机索引
            // 检查当前索引是否已被选中
            int is_duplicate = 0;
            for(int j=0; j<i; j++){
                if(selected[j] == idx){
                    is_duplicate = 1;
                    break;
                }
            }
            if(!is_duplicate){
                selected[i] = idx;
                break;
            }
        } while(1);
        printf("第%d题:%s\n", i+1, erts[selected[i]]);
    }
    
    return 0;
}

关键说明

  • char**类型匹配字符串数组的指针类型,通过erts[i]可以直接访问题库中的第i道题。
  • 随机选题目时,通过循环去重避免重复出题,srand(time(NULL))确保每次运行的随机序列不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:01:40