首页 文章

在c中创建一个大小为1000000000的数组给出了以下错误 . 请帮我理解并解决[重复]

提问于
浏览
2

这个问题在这里已有答案:

我需要创建一个大小为1000000000的数组 .

#include<iostream>
#include<cstdlib>
#include<math.h>
#include<cmath>
using namespace std;
unsigned long long int arr[1000000000];
int ZofF(long long int n)
{
    for(unsigned long long int i=1;i<=1000000000;i++)
{
}
}
int main()
{
    return 0;
}

我收到如下错误:

C:\ Users \ TARUNM~1 \ AppData \ Local \ Temp \ cccgeKSu.s汇编程序消息:63 C:\ Users \ TARUNM~1 \ AppData \ Local \ Temp \ cccgeKSu.s错误:00000001dcd6504e的值对于字段来说太大在000000000000004e的4个字节87 C:\ Users \ TARUNM~1 \ AppData \ Local \ Temp \ cccgeKSu.s错误:00000001dcd6507e的值对于000000000000007e的4字节字段而言太大


有一个解决方案:How to handle an array with size 1,000,000,000 in C++?

我试图把它分成多个数组,我实际上并没有理解上面链接的解决方案 . 这是代码:

#include <iostream>
的#include <cstdlib>
的#include <math.h>中
的#include <CMATH>
using namespace std;
unsigned long int arr [125000000];
unsigned long int ar2 [125000000];
unsigned long int ar3 [125000000];
unsigned long int ar4 [125000000];
unsigned long int ar5 [125000000];
unsigned long int ar6 [125000000];
unsigned long int ar7 [125000000];
unsigned long int ar8 [125000000];
int ZofF(long long int n)
{
for(unsigned long long int i = 1; i <= 250000000; i)
{
}
}
int main()
{
返回0;
}

但是这段代码给了我以下错误 .

c:\ program files(x86)\ dev-cpp \ mingw64 \ x86_64-w64-mingw32 \ lib \ crt2.o in function check_managed_app':357 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw- w64-crt \ crt \ crtexe.c( . text 0x21):重定位被截断以适合:R_X86_64_PC32针对在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32中的.bss部分中定义的symbolmingw_initltsdrot_force' \ lib / libmingw32.a(lib64_libmingw32_a-tlssup.o)358 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x2b):重定位被截断以适合:R_X86_64_PC32对象符号mingw_initltsdyn_force'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-tlssup.o)中的.bss部分中定义359 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x35):重定位被截断以适合:R_X86_64_PC32对象符号mingw_initltssuo_force'在C:\ Program中的.bss部分中定义文件(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-tlssup.o)360 h:\ crossdev \ src \ mi ngw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x3f):重定位被截断以适合:R_X86_64_PC32对象符号mingw_initcharmax'在C:\ Program Files(x86)中的.bss部分中定义\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-charmax.o)c:\ program files(x86)\ dev-cpp \ mingw64 \ x86_64-w64-mingw32 \ lib \ crt2 . o在函数pre_c_init'中:129 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x51):重定位被截断以适合:R_X86_64_PC32对象symbolmingw_app_type'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-mingw_helpers.o)中的.bss部分135 h:\ crossdev \ src \ mingw-w64-v3 -svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x71):重定位被截断以适合:R_X86_64_PC32对象符号_fmode'在C:\ Program Files(x86)\ Dev-Cpp中的.bss部分中定义MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-xtxtmode.o)133 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(.text 0X 78):重定位被截断以适合:R_X86_64_PC32对象符号__onexitend'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-atonexit)中的COMMON部分中定义 . o)133 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x7f):重定位被截断以适合:R_X86_64_PC32针对COMMON部分中定义的符号__onexitbegin'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-atonexit.o)135 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x86):重定位被截断以适合:R_X86_64_PC32对象符号`__imp__fmode'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \中的.idata $ 5部分中定义x86_64-w64-mingw32 \ lib / libmsvcrt.a(dqows00253.o)c:\ program files(x86)\ dev-cpp \ mingw64 \ x86_64-w64-mingw32 \ lib \ crt2.o在函数pre_cpp_init'中:157 h: \ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x136):重定位被截断以适合:R_X86_64_PC32对抗symbo l_newmode'在C:\ Program Files中的.bss部分中定义(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-_newmode.o)162 h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c( . text 0x13d):从输出中省略了额外的重定位溢出[错误] ld返回1退出状态

请帮助我理解为什么会发生这种情况以及如何创建一个大小为1000000000的数组 . 我在i5内核上使用64位Windows 8.1和4Gb RAM . 我必须升级我的硬件吗?

3 回答

  • 0

    为什么需要创建一个大小为1000000000的数组?你想在这里解决什么问题?也许std :: vector会是更好的选择,具体取决于您尝试存储的数据类型 . 同样,这实际上取决于你在这里要解决的问题 .

  • 0

    long long int 的大小至少为64位 . 1000000000 * 64约为8 Gb,大于RAM . 这将是您的物理内存限制 .

    另一个限制是系统中设置的std :: size_t的最大大小 . 您可以通过以下方式找到它:

    #include <iostream>
    #include <limits>
    
    int main () {
        std::cout << std::numeric_limits<size_t>::max()<<std::endl;
        return 0;
    }
    

    但是,就像安德鲁所说,解决任何问题都不是常见的方法 . 我建议你升级代码而不是硬件:)

  • 0

    关于何时报告错误,你的问题不是很清楚,但它看起来像是在编译或链接期间,而不是在运行时 .

    如果为true,则表明这与您的硬件无关,而是您的编译器/链接器/加载器的限制 .

    您可以查看文档以确定是否有允许更大阵列的选项 .

    但是,根据其他链接的答案,您几乎肯定会在此处使用动态内存分配,而不是静态定义的数组 .

    执行此操作时,请务必检查分配失败 .

    const size_t numElements = 1000000000;
        unsigned long long* arrayData = new unsigned long long[numElements];
        if (arrayData == nullptr)
        {
            // Problem.
        }
        else
        {
            // All good.
            // Use it.
            // Clean up using array delete.
            delete[] arrayData;
        }
    

    现在,您可能仍需要将整体大小保持在4GB以下,因此根据您的其他代码将其分成多个底层数组 .

    如果您执行所有这些操作,则由于运行时缺少系统内存,您仍会遇到问题 .

    您可以购买更多RAM(并且您需要8GB以及更多用于系统的其余部分),或者重新考虑您的方法,将问题分成小块 .

相关问题