2016-02-24 36 views
1

我试着编写一个程序,它接受命令行输入(应该是数字),并将它们存储在一个动态分配的数组中,通过访问该数组将其打印出来。但是,它将打印随机值。回顾动态分配数组的值

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    int i; 
    int *list_nums; 
    list_nums = malloc(argc * sizeof(int)); 
    for (i = 1; i < argc; i++) { 
     list_nums[i-1] = argv[i]; 
    } 
    printf("you entered: "); 
    for (i = 0; i < argc-1; i++) { 
     printf("%d, ", list_nums[i]); 
    } 
    return 0; 
} 

本来,我在第二个print语句for循环:

 printf("%s, ", list_nums[i]) // %s instead of %d 

因为argv[]设置为char但是这给了我一个分段错误。这里发生了什么?

+0

为什么当你向分配的内存写入char *时malloc()'sizeof(int)'? – EOF

回答

1

时刻关注编译器的警告。如果您没有收到任何警告,请检查您的编译器设置。

$ 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]); 
} 
1

您的方法存在的问题是您正在为int阵列分配argv元素。由于argv元素是C字符串,你需要解析他们获得int

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

在程序的最后不要忘了free(list_nums)

包括<stdlib.h>使用atoi

1

请尝试以下

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) { 
    int i; 
    int *list_nums = NULL; 

    if (argc > 1) list_nums = malloc((argc - 1) * sizeof(int)); 

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

    printf("you entered: "); 
    for (i = 0; i < argc-1; i++) { 
     printf("%d, ", list_nums[i]); 
    } 
    printf("\n"); 

    free(list_nums); 

    return 0; 
} 

注重的是参数存储喜欢的字符数组。所以你必须在int类型的对象中转换一个包含数字的字符串。