所以我正在用C制作一个锯齿状的数组。我认为我的代码可以填充数组,但是我遇到的问题是打印。
下面的代码
#include <stdio.h>
int *length;
int **row;
int main(int argc, char *argv[]) {
//make an array that contains the lengths of the columns for each row
length = malloc(argc * sizeof (int));
for (int k = 0; k < argc; k++) {
length[k] = atoi(argv[k]);
// printf("%d ", lengths[k]);
}
row = malloc(argc * sizeof (int));
// fill the columns
int fill = 1;
for (int i = 0; i < argc; i++) {
row[i] = malloc(sizeof (int) * length[i]);
for (int j = 0; j < length[i]; j++)
row[i][j] = fill;
}
//print it
for (int i = 0; i < argc; i++)
for (int j = 0; j < length[i]; j++)
printf("%d", row[i][j]);
return 0;
}
该程序采用命令行参数,因此如果我输入:
./jagged 1 3 5 1
我应该得到:
1
1 1 1
1 1 1 1 1
1
相反,我的编译器只是说
RUN FAILED
答案 0 :(得分:2)
argc == 5
,而argv[0]
包含./jagged
。
atoi
对于argv[0]
将失败,并且其错误行为未定义。如果程序继续,则返回的值是0,并且您将0作为长度之一存储。这意味着您将执行malloc(sizeof(int) * 0);
,这也可能会引起麻烦。
要解决这些问题,您有两种选择:
i = 1; i < argc; i++
中回避以避免argv[0]
。--argc, ++argv;
或argc
之前,添加一行argv
。您还应考虑使用strtol
代替atoi
,因为它具有明确的错误行为。
除了程序逻辑之外,您只是忘记包含<stdlib.h>
以便能够使用malloc
和atoi
as @Vishal explained。
答案 1 :(得分:2)
使用一些限制性的编译器标志,例如--pedantic --std=c11 -Wall -Wextra
代表gcc。这将帮助您发现一些错误,例如缺少自己。
在呼叫stdlib.h
时包括malloc()
。
argv[0]
不是您的第一个命令行参数,而是二进制文件的名称。因此,您必须调整循环。
要简化未给出任何参数的情况,请包含assert.h
,并使用assert(argc > 1);
检查主行开头的参数数量。
您对row
的分配不正确,但依赖于平台,因为row
的元素类型为int *
,而不是int
。而是分配row = malloc((argc - 1) * sizeof(int *));
。
答案 2 :(得分:1)
您需要包括stdlib
才能使用malloc
功能并在第一个程序段之后打印\ n
#include <stdio.h>
#include <stdlib.h>
int *length;
int **row;
int main(int argc, char *argv[]) {
//make an array that contains the lengths of the columns for each row
length = malloc(argc * sizeof (int));
for (int k = 0; k < argc; k++) {
length[k] = atoi(argv[k]);
// printf("%d ", lengths[k]);
}
row = malloc(argc * sizeof (int));
// fill the columns
int fill = 1;
for (int i = 0; i < argc; i++) {
row[i] = malloc(sizeof (int) * length[i]);
for (int j = 0; j < length[i]; j++)
row[i][j] = fill;
}
//print it
for (int i = 0; i < argc; i++)
{
for (int j = 0; j < length[i]; j++){
printf("%d", row[i][j]);
}
printf("\n");
}
return 0;
}