无法在 c 中初始化数组 |警告:从 long 转换为 long unsigned

unable to initialize array in c | warning: conversion to long unsigned from long

我正在尝试编写一个程序,首先创建一个表示图形的二维数组(请注意,图形的维度将作为输入给出)。

我想在 0 处初始化这个数组,在谷歌搜索后我发现你必须使用 memset() 来完成它,因为数组的内存将从输入文件中动态分配。

下面是我的程序的一小部分:

long int N;

int main(int argc, char *argv[]) {
    long int i;

    FILE * txt;
    txt = fopen(argv[1], "r");
    if (txt == NULL) {
        printf("There was an error trying to open the file.\n");
        return 0;
    }

    fscanf(txt, "%li", &N);

    long int graph[N][N];
    memset(graph, 0, N*N*sizeof(long int));

    return 1;
}

当我用 gcc -Wconversion 编译它时,我收到以下警告:

warning: conversion to ‘long unsigned int’ from ‘long int’ may change the sign of the result [-Wsign-conversion] memset(graph, 0, N*N *sizeof(long int));

我不明白编译器在代码的哪一点试图将 long int 转换为 unsigned int。我搜索了一下,只有当他们混合了不同类型的变量时,人们才会遇到同样的问题。

如有任何帮助,我们将不胜感激!

---编辑---

使用 我能够解决上述警告(我必须将 N 更改为 size_t 类型才能正确调用 memset()),但现在我想初始化另一个long int array 到 LONG_MAX 我得到一个不同的:

memset(dist, LONG_MAX, N*sizeof(long int));

warning: overflow in implicit constant conversion [-Woverflow]

函数 memset 需要类型 size_t 的第三个参数。 所以声明变量N为

size_t N;

并写

fscanf(txt, "%zu", &N);

第二个警告与memset

调用的第二个参数有关
memset(dist, LONG_MAX, N*sizeof(long int));

期望函数内部的类型 int 转换为类型 unsigned char

这是函数声明。

void *memset(void *s, int c, size_t n);

通常该函数的唯一应用是对数组进行零初始化。

size_t 可以解释为 unsigned int 或 unsigned long int;取决于机器。

不需要使用memset()来用0填充数组,你可以把这些东西交给编译器。 只需将 0 分配给第一个元素,编译器就会将 0 分配给所有未初始化的元素!

long int graph[N][N] = {0};

您试图在错误的地方使用 memset()! memset() 设置 'bytewise manner'.

中的存储

void *memset(s,c,n) --> place character c into first n characters of s, return s

注意 c 是一个字符而不是整数。

So, how to initialize an array with LONG_MAX ?

使用循环:

 for(long i = 0; i < N; ++i)
   dist[i] = LONG_MAX;