如何修复命令行参数的输出以打印出正确的整数?

How do I fix output from command-line arguments to printing out the correct integers?

#define N 10

int main(int argc, char *argv[])
{
    int *a = malloc(sizeof(N));
    int i;

    for(i = 1; i < argc; i++) {
        *(a++) = atoi(argv[i]);
    }

    i = 0;
    while(i < N) {
        printf("%d ", *(a++));
        i++;
    }
}

我很困惑为什么我的输出全是 0。我不太确定如何修复它,因为我是命令行参数/指针的新手。这个程序的背景是它接受整数,然后应该使用 atoi 将它们从字符串转换为整数,然后使用指针算法打印出新数组。

这里有很多错误。

sizeof(N) 给出整数常量的大小(可能是 4 个字节)。你的意思是 malloc(N * sizeof(int));但是,如果 N 是 mall 并且您在编译时知道它,那么使用 malloc 就没有多大意义。你想要 malloc argc 整数。然后程序将扩展到数百万个命令行参数,假设 shell 允许输入这么长的一行。

然后当你 malloc 一个指针时,你需要挂在它上面。不要增加它。如果你想要一个移动指针,使用两个指针,a 和 ptr。 a 指向缓冲区和 "owns" 它,ptr 是一个临时移动的。然而,数组语法 a[i] 几乎总是优于移动指针。

如果 argc 小于 N,最后的 while 将打印垃圾值。这可能是您在学习练习/探索性编程中想要的,但不是您通常希望实现的。

根据我更好的判断,这是您作业的解决方案。请注意以下事项:

  • 它没有转换 malloc
  • 的 return 值
  • 正在测试 malloc 的 return 值是否为非 NULL
  • 它正在释放它分配的内存
  • 它使用了多种指针算法
  • 正在更正 argv[0]
  • 的使用
  • 它正在纠正 argc 的误用
  • 它使用 "yoda condition" 来消除编译器愚蠢的可能性
  • 如果您提供超过 N 个参数,它仍然会出现段错误
#define N 10
int main(int argc, char *argv[])
{
    int *numbers;

    if (NULL != (numbers = malloc(N * sizeof *numbers))) {
        for(int i = 0; i < (argc - 1); i++) {
            *(numbers + i) = atoi(argv[i + 1]);
        }

        for(int* a = numbers; a < (numbers + (argc - 1)); a++) {
            printf("%d ", *(a));
        }
        free(numbers);
    }
}