【C编译】报错问题收集

这篇博客总结了C语言编程中常见的编译错误,包括未声明的标识符、初始化时丢弃常量限定符、可变长度对象未初始化、ld链接错误、程序中的非法字符、调试结果与运行结果不符、调试时无法输入以及数组类型的表达式赋值错误。针对每个错误,文章提供了详细的错误原因和修正方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、[Note] each undeclared identifier is reported only once for each function it appears in

[注] 每个未申报的标识符是为每一个函数似乎只报道一次(写错了或多写了标识符)

如:

printf("f("%s", "%s") = %d\n", p, q, result);

修改:

printf("f(\"%s\", \"%s\") = %d\n", p, q, result);

printf 函数里面 双引号需要 \ 才能无误地原样输出。

2、[Warning] initialization discards ‘const’ qualifier from pointer target type

[警告] 初始化时丢弃了从指针目标类型中丢弃了const限定符

如:

const int a[10] = {0};
char* p = a;			//会出现此Warning

解决办法:

const int a[10] = {0};
const int* p = a;

3、[Error] variable-sized object may not be initialized

[错误] 可变长度的对象没有被初始化

如:

int n = 5;
int a[n] = {1,2,3,4,5};

错因:
对于可变长度数组(长度由变量控制), 不能在该数组定义的同时初始化,需要在定义之后单独赋值初始化。

修改:

int n = 5;
int a[n];
memset(a, 0, sizeof(a));		//合法初始化,将a的所有元素初始化为0

4、[Error] ld returned 1 exit status

[错误] ld返回一个退出状态
可能原因:

  • 上一个运行结果没有关闭

5、[Error] stray ‘\241’ in program

可能原因:程序中有非法字符,可能不小心转换成全角输入了。

6、调试结果与运行结果不一致

如:

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

#define LEN 500    //限制输入的字符串长度

int main(){
    
    char str[LEN+1], differ[LEN+1];    //此处数组未初始化
    int len_str, len_differ;
    int i;
    
    scanf("%s", str);
    len_str = strlen(str);
    
    strncpy(differ, str, 1);
    len_differ = strlen(differ);
    //在differ中逐个检索str中的元素
    for(i=0; i<len_str; i++){
        //没被记录
        if( strchr(differ, str[i]) == NULL ){
            //单个字符拼接到differ末尾 
            differ[strlen(differ)] = str[i];
            differ[strlen(differ) + 1] = '\0';
        }
    }
    printf("%d", strlen(differ));
    
    
    return 0;
}

错误原因:暂且未知
解决办法:把数组初始化

7、调试时无法输入

问题描述:
点击调试后弹出对话框,但对话框立即最小化,且无法输入。

原因:
断点设置在 scanf 那一行。

解决办法:
修改断点,将断点设置在输入函数后面。

8、[Error] assignment to expression with array type

错误原因:

  • 数组不能直接给数组赋值。

解决办法:

  • 若是字符串,可使用strcpy函数
  • 若是数组,则需要逐个赋值。
### C语言编译错误 `file not recognized` 和 `collect2: error: ld returned 1 exit status` 的解决方案 #### 错误分析 该类错误通常发生在链接阶段,提示链接器未能正确处理某些目标文件或库文件。以下是可能的原因及其对应的解决办法: 1. **通配符使用不当** 如果在命令行中直接使用 `*` 而非 `*.c` 来指定多个源文件,则可能会将无关的文件(如头文件或其他类型的文件)也纳入编译过程,从而引发此错误[^1]。 2. **位数不一致** 链接器检测到的目标文件或库文件可能是不同架构下的产物(例如,64位与32位混用)。这种情况下,即使文件本身有效,但由于架构冲突也会导致类似的错误消息[^2]。 3. **文件扩展名缺失或错误** 若待编译的文件缺少 `.c` 或 `.cpp` 扩展名,GCC/G++ 可能会将其视为其他类型而非标准 C/C++ 源码,进而忽略这些文件并抛出异常[^3]。 4. **工具链配置问题** 在特定开发环境中(比如 Qt 使用 MinGW 工具链时),如果收集程序 (`collect2`) 无法找到实际调用的真实链接器 (`real-ld`),也可能触发此类警告信息[^4]。 #### 解决方案 ##### 方法一:修正通配符应用范围 确保仅选择符合条件的源代码文件参与构建流程。例如: ```bash gcc *.c -o output_program ``` 上述指令明确指定了所有以“.c”结尾的文件作为输入参数传递给 GCC 编译器执行操作[^1]。 ##### 方法二:统一目标平台架构 确认整个项目的依赖项均基于同一套体系结构创建出来——要么全是针对 x86_64 构建而成;要么全都是 i386 下生成的结果。可以通过如下方式验证现有对象模块的具体属性: ```bash file your_object_file.o ``` 对于任何不符合当前工作环境设定的部分都需要重新制作一遍相应的版本号匹配的新副本[^2]。 ##### 方法三:补充正确的文件后缀名 检查每一个打算提交至编译管线中的单元是否具备恰当的标准命名约定形式(.c/.cpp),必要时候手动添加上去后再试一次完整的组装周期[^3]。 ##### 方法四:调整IDE设置或者更换合适的交叉编译器 当遇到像 VSCode 中因默认行为限制所造成的困扰时,可以考虑修改其内部关于如何解析外部资源的相关选项卡内容;而对于跨操作系统移植场景而言,则建议选用专门定制过的兼容版 SDK 套件来进行后续作业活动[^4]。 --- ### 示例代码片段 假设存在两个独立定义却相互关联的功能实现部分分别保存于 add.c subtract.c 文件当中,那么我们可以采用下面这样的做法完成最终可执行体的合成动作: ```bash gcc add.c subtract.c -o math_operations ``` 假如其中任何一个环节出现了偏差情况的话(比如说忘记加 .c 后缀), 就极有可能遭遇前面提到的那种状况. --- 问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值