【发布时间】:2020-01-26 13:04:35
【问题描述】:
我正在尝试编写一个程序,该程序首先创建一个表示图形的二维数组(请注意,图形的维度将作为输入给出)。
我想将这个数组初始化为 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 编译它时,我收到以下警告:
警告:从“long int”转换为“long unsigned int”可能会改变 结果的符号 [-Wsign-conversion] memset(graph, 0, N*N *sizeof(long int));
我无法理解编译器在代码的哪一点尝试将 long int 转换为无符号整数。我搜了一下,只有当他们混合了不同类型的变量时,人们才会遇到同样的问题。
任何帮助将不胜感激!
---编辑---
使用help of 'Vlad from Moscow' 我能够解决上述警告(我必须将 N 更改为 size_t 类型才能正确调用 memset()),但现在我想将另一个 long int 数组初始化为 LONG_MAX 并且我得到了另一个:
memset(dist, LONG_MAX, N*sizeof(long int));
警告:隐式常量转换溢出 [-Woverflow]
【问题讨论】:
标签: c arrays initialization overflow memset