【问题标题】:Allocating 2D dynamic arrays (with long long int)分配 2D 动态数组(使用 long long int)
【发布时间】:2013-06-06 12:09:40
【问题描述】:
    long long int ** A = new long long int * [N];
    for ( long long int i=0; i<N; i++)
    {A[i]=new long long int[N];}

为什么会导致这个警告: 警告 C4244:“正在初始化”:从“__int64”转换为“无符号整数”,可能会丢失数据

难道不能有long long int 2d动态数组吗?

【问题讨论】:

  • N的类型是什么?
  • 你想要 2^64 * 2^ 64;这是一个包含 2^128 个元素的数组。我怀疑整个世界有足够的内存来保存你的数组。
  • 嗯,我明白了@MariusBancila,谢谢
  • @Marius Bancila:不知道N的值,你怎么能说有多少元素?

标签: c++ dynamic-arrays


【解决方案1】:

您收到的警告与您的数组由long long 元素组成的事实完全无关。警告是针对您的i 变量或您的N 发出的。很可能是N 导致了问题。 N 是什么?它是如何声明的?我怀疑它也是long long

在 C++ 语言中,用于指定内存大小(顺便说一下,数组大小和索引)的类型称为 size_t。显然在您的平台上 size_t 是 32 位 unsigned int 类型(32 位平台?)的代名词。编译器正在尝试将您的 N(显然是 64 位类型)转换为 size_t 并触发警告。

无论如何,绝对没有理由坚持将long long 用于iN。为两者选择更合理的类型(或将N 转换为该类型),警告将消失。

【讨论】:

  • 是否可以改变size_t
  • @Ezz: 更改size_t?不,这是标准类型。但为什么?出于什么目的?您真正需要做的是更改iN 的声明。将它们声明为long long 绝对没有意义。事实上,将它们声明为size_t 可能是个好主意。这将解决您的警告。
【解决方案2】:

试试这个

  #include<iostream>
#include<stdio.h>
using namespace std;

int main(int argc, char *argv[]) {
        int N=10;
        int i;
        long long int **A=new long long int*[N];
        for(i=0;i<N;i++)
        {
                A[i]=new long long int [N];
        }
        A[2][5]=5;
        cout<<A[2][5]<<endl;
        for(i=0;i<N;i++)
                delete []A[i];
        delete [] A;
        return 0;
}

为我工作 即使使用 -Wall 也没有警告

【讨论】:

  • 我可以知道否决的原因吗?我对 N 使用常量,但也可以是动态值,并且此代码将正常运行,除非并且直到您超出允许的二维数组的数组大小
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多