时刻关注编译器的警告。如果您没有收到任何警告,请检查您的编译器设置。
$ gcc -Wall -O a.c
a.c: In function ‘main’:
a.c:6:5: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
list_nums = malloc(argc * sizeof(int));
^
a.c:6:17: warning: incompatible implicit declaration of built-in function ‘malloc’
list_nums = malloc(argc * sizeof(int));
^
a.c:8:24: warning: assignment makes integer from pointer without a cast
list_nums[i-1] = argv[i];
^
第一个警告说malloc
没有声明;你错过了#include <stdlib.h>
。在大多数系统上这不会导致实际问题。第二个警告是同样问题的后果。
第三个警告表示真正的问题。 argv
是指向char
的指针数组,因此argv[i]
是指向char
的指针。 list_nums
指向一个整数数组。所以你正在分配一个指向一个整数的指针。您打印的随机数字是内存中参数的地址。
您可以将一个字符串数组复制到一个字符串数组中。在这种情况下,您需要将list_nums
更改为char*
的数组,并使用%s
说明符进行打印。
看来你打算将参数解释为整数。如果你想将参数 - 即字符串 - 转换为整数,你需要明确地做到这一点。您可以使用atoi
函数实现快速一次性代码,或使用strtol
获得强大的代码(atoi
不允许错误检查)。
long *list_nums = malloc((argc-1) * sizeof(*list_nums));
char *end;
if (list_nums == NULL) {
fprintf(stderr, "Not enough memory\n");
return EXIT_FAILURE;
}
for (i = 1; i < argc; i++) {
list_nums[i-1] = strtol(argv[i], &end, 0);
if (*end != 0) {
fprintf(stderr, "Invalid argument: %s\n", argv[i]);
return EXIT_FAILURE;
}
}
for (i = 0; i < argc-1; i++) {
printf("%ld, ", list_nums[i]);
}
为什么当你向分配的内存写入char *时malloc()'sizeof(int)'? – EOF