Sasakisouji 2023-03-09 13:22 采纳率: 71.4%
浏览 13

calloc给longlongint长度的数组分配内存时出错

calloc给longlongint类型的数组分配内存会报警告,数组过长会出错。似乎是参数长度受限。

警告如下:

warning C4244: “参数”: 从“__int64”转换到“size_t”,可能丢失数据

完整代码如下:

#define  _CRT_SECURE_NO_WARNINGS

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

int main(){
    long long int *A, *g, r;
    long long int sub = 0;
    long long int n, N, *f, lg, rg, lf, rf;
    long long int length = 0;
    scanf("%lld %lld", &n, &N);
    r = N / (n + 1);
    A = (long long int *)calloc(n + 2, sizeof(long long int));//报警告
    A[0] = 0;
    A[n + 1] = N;
    f = (long long int *)calloc(N, sizeof(long long int));//报警告
    g = (long long int *)calloc(N, sizeof(long long int));//报警告
    for (int i = 1; i < (n + 1); i++){
        scanf("%lld", &A[i]);
        if (A[i] < N)f[A[i]] = i;
    }
    for (int i = 1; i < N; i++){//完成g[]和f[]
        g[i] = i / r;
        if (f[i] == 0)
            f[i] = f[i - 1];
        else continue;
    }
/*    for (int i = 0; i < N; i++){
        sub += abs(g[i] - f[i]);
    }*/
    for (long long int j = 0; j < n + 1; j++){
        for (long long int i = A[j]; i < A[j + 1]; i += length){
            lg = i;
            lf = i;
            rf = A[j + 1] - 1;
            rg = i + r - 1 - i%r;
            length = (rf>rg ? rg : rf) - i + 1;
            sub += length*(abs(f[i] - g[i]));
        }
    }
    printf("%lld", sub);
    system("pause");
    return 0;
}

是否有方法给longlongint长度的数组动态分配内存,求解答

  • 写回答

2条回答 默认 最新

  • qq_28884137 2023-03-09 13:45
    关注

    可以使用unsigned long long类型的数组来代替long long类型的数组。另外,可以使用malloc函数动态分配内存。具体的代码如下:

    
    #define  _CRT_SECURE_NO_WARNINGS
    
    #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    
    int main(){
        unsigned long long int *A, *g, r;
        unsigned long long int sub = 0;
        unsigned long long int n, N, *f, lg, rg, lf, rf;
        unsigned long long int length = 0;
        scanf("%llu %llu", &n, &N);
        r = N / (n + 1);
        A = (unsigned long long int *)malloc((n + 2)*sizeof(unsigned long long int));//使用malloc分配内存
        A[0] = 0;
        A[n + 1] = N;
        f = (unsigned long long int *)malloc(N*sizeof(unsigned long long int));
        g = (unsigned long long int *)malloc(N*sizeof(unsigned long long int));
        for (unsigned long long int i = 1; i < (n + 1); i++){
            scanf("%llu", &A[i]);
            if (A[i] < N)f[A[i]] = i;
        }
        for (unsigned long long int i = 1; i < N; i++){
            g[i] = i / r;
            if (f[i] == 0)
                f[i] = f[i - 1];
            else continue;
        }
        for (unsigned long long int j = 0; j < n + 1; j++){
            for (unsigned long long int i = A[j]; i < A[j + 1]; i += length){
                lg = i;
                lf = i;
                rf = A[j + 1] - 1;
                rg = i + r - 1 - i%r;
                length = (rf>rg ? rg : rf) - i + 1;
                sub += length*(abs(f[i] - g[i]));
            }
        }
        printf("%llu", sub);
        system("pause");
        return 0;
    }
    
    
    

    注意,使用malloc函数分配内存后,需要使用free函数释放内存,否则会出现内存泄漏的情况。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月9日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境