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

MSVC 2015运行C代码无输出,是否需修改C标准?如何解决?

C代码在MSVC 2015无输出的原因及解决办法

测试代码

#include <stdio.h>

typedef char charray5[5];

charray5 carr1 = { 'a', 'b', 'c', 'd', '\0' };
charray5 carr2 = { 'q', 'w', 'e', 'r', '\0' };
charray5 carr3 = { 'x', 'y', 'z', 'w', '\0' };

charray5* func1() { return &carr1; }
charray5* func2() { return &carr2; }
charray5* func3() { return &carr3; }

char (*(*x[3])())[5] = { func1, func2, func3 };

int main()
{
    printf("func1 = [%c, %c, %c, %c]\n",
        ((*(x[0]))())[0][0], ((*(x[0]))())[0][1],
        ((*(x[0]))())[0][2], ((*(x[0]))())[0][3]);
    printf("func2 = [%c, %c, %c, %c]\n",
        ((*(x[1]))())[0][0], ((*(x[1]))())[0][1],
        ((*(x[1]))())[0][2], ((*(x[1]))())[0][3]);
    printf("func3 = [%c, %c, %c, %c]\n",
        ((*(x[2]))())[0][0], ((*(x[2]))())[0][1],
        ((*(x[2]))())[0][2], ((*(x[2]))())[0][3]);
    return 0;
}

预期输出(Code::Blocks中正常运行)

func1 = [a, b, c, d]
func2 = [q, w, e, r]
func3 = [x, y, z, w]

问题现象

使用MSVC 2015编译运行后无任何输出,无警告和错误,仅显示‘按任意键继续...’。猜测是否因为MSVC 2015采用C99标准,而代码适配C11或C17标准?


解答

  1. 猜测正确性判断
    你的猜测不完全正确。MSVC 2015对C标准的支持确实不完善,仅部分实现了C99,未完全支持C11/C17,但这段代码的问题和C版本标准关联不大,核心是MSVC对函数指针的类型匹配检查更严格,且在typedef的类型推导上存在行为差异,导致代码出现未定义行为,最终无输出。

  2. MSVC 2015中获取正常输出的解决方法

方法一:强制类型转换函数指针

修改函数指针数组的初始化代码,给每个函数指针添加显式类型转换,让MSVC接受类型匹配:

char (*(*x[3])())[5] = { (char (*(*))())func1, (char (*(*))())func2, (char (*(*))())func3 };

方法二:简化指针访问逻辑

避免嵌套的函数指针调用,先将函数返回的指针存储到临时变量中再访问,代码更清晰且避开类型匹配问题:

int main()
{
    char (*p1)[5] = func1();
    printf("func1 = [%c, %c, %c, %c]\n", p1[0][0], p1[0][1], p1[0][2], p1[0][3]);
    
    char (*p2)[5] = func2();
    printf("func2 = [%c, %c, %c, %c]\n", p2[0][0], p2[0][1], p2[0][2], p2[0][3]);
    
    char (*p3)[5] = func3();
    printf("func3 = [%c, %c, %c, %c]\n", p3[0][0], p3[0][1], p3[0][2], p3[0][3]);
    return 0;
}

方法三:明确typedef函数指针类型

先typedef出函数指针的类型,再用该类型定义数组,消除类型歧义:

#include <stdio.h>

typedef char charray5[5];
typedef charray5* (*FuncPtr)(); // 定义返回charray5*的函数指针类型

charray5 carr1 = { 'a', 'b', 'c', 'd', '\0' };
charray5 carr2 = { 'q', 'w', 'e', 'r', '\0' };
charray5 carr3 = { 'x', 'y', 'z', 'w', '\0' };

charray5* func1() { return &carr1; }
charray5* func2() { return &carr2; }
charray5* func3() { return &carr3; }

FuncPtr x[3] = { func1, func2, func3 }; // 使用明确的函数指针类型定义数组

int main()
{
    char (*p)[5] = x[0]();
    printf("func1 = [%c, %c, %c, %c]\n", p[0][0], p[0][1], p[0][2], p[0][3]);
    
    p = x[1]();
    printf("func2 = [%c, %c, %c, %c]\n", p[0][0], p[0][1], p[0][2], p[0][3]);
    
    p = x[2]();
    printf("func3 = [%c, %c, %c, %c]\n", p[0][0], p[0][1], p[0][2], p[0][3]);
    return 0;
}

内容的提问来源于stack exchange,提问作者The mayor of kazeroun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23