无法在 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;
我正在尝试编写一个程序,首先创建一个表示图形的二维数组(请注意,图形的维度将作为输入给出)。
我想在 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。我搜索了一下,只有当他们混合了不同类型的变量时,人们才会遇到同样的问题。
如有任何帮助,我们将不胜感激!
---编辑---
使用
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;