Python_enjoy 2023-09-27 20:51 采纳率: 76.9%
浏览 8
已结题

C++,为什么编译失败?

为什么编译失败?

img

代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000000005];

int main()
{
    int n,mm=-1;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        int t;
        cin>>t;
        mm=max(mm,t);
        a[t]++;
    }
    int maxn=0;
    for(int i=1; i<=mm; i++) maxn=max(maxn,a[i]);
    int tot=0;
    for(int i=1; i<=mm; i++) if(a[i]==maxn) tot++;
    cout<<tot<<endl;
    for(int i=1; i<=mm; i++) if(a[i]==maxn) cout<<i<<" ";
    return 0;
}

错误信息:

No valid executable file was produced by the compiler
./ccpn9aAa.o: in function `__static_initialization_and_destruction_0(int, int)':
src:(.text+0x1a0): relocation truncated to fit: R_X86_64_PC32 against `.bss'
src:(.text+0x1b9): relocation truncated to fit: R_X86_64_PC32 against `.bss'
collect2: 错误:ld 返回 1
  • 写回答

2条回答 默认 最新

  • Leodong. 2023-09-27 21:02
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    根据你提供的错误信息,编译失败的原因可能是出现了与链接(linking)相关的问题。具体而言,以下错误信息可能是关键所在:

    ./ccpn9aAa.o: in function `__static_initialization_and_destruction_0(int, int)':
    src:(.text+0x1a0): relocation truncated to fit: R_X86_64_PC32 against `.bss'
    src:(.text+0x1b9): relocation truncated to fit: R_X86_64_PC32 against `.bss'
    collect2: 错误:ld 返回 1
    

    这些错误提示表明在链接过程中出现了截断错误(relocation truncated),这通常是由于数据或代码段太大而无法适应可执行文件的内存空间引起的。

    根据你的代码,问题可能出在以下这行代码上:

    int a[1000000005];
    

    你声明了一个非常大的数组 a,其大小为 1000000005。这个数组的大小超出了常见的栈(stack)大小限制,导致链接失败。

    为了解决这个问题,你可以尝试将数组 a 的大小改为更合理的范围,比如使用动态内存分配(使用 new 运算符)或者使用 std::vector 动态数组。下面是修改后的示例代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n, mm = -1;
        cin >> n;
        vector<int> a(1000000005); // 使用 std::vector 动态数组
        for (int i = 1; i <= n; i++)
        {
            int t;
            cin >> t;
            mm = max(mm, t);
            a[t]++;
        }
        int maxn = 0;
        for (int i = 1; i <= mm; i++)
            maxn = max(maxn, a[i]);
        int tot = 0;
        for (int i = 1; i <= mm; i++)
            if (a[i] == maxn)
                tot++;
        cout << tot << endl;
        for (int i = 1; i <= mm; i++)
            if (a[i] == maxn)
                cout << i << " ";
        return 0;
    }
    

    请注意,上述代码中使用了 std::vector 替代了原先的数组 a,以便在运行时动态分配内存。这样可以避免栈溢出的问题,并且代码可以正确编译和运行。

    希望这能解决你的问题。如果还有其他疑问,请随时提问。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月4日
  • 已采纳回答 10月4日
  • 创建了问题 9月27日

悬赏问题

  • ¥20 这张图页脚大概具体代码该怎么写?
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22