单位指针的问题

时间:2015-12-11 19:15:38

标签: c pointers command-line-arguments

我在使用指针时遇到了一些麻烦。我知道这可能是我的一些愚蠢的错误,但我现在可以使用一些帮助。

我正在制作一个有一些命令行参数的程序,我决定 创建一个名为get_param(...)的函数,这样我的主要内容中没有大量的行用于此目的。

以下是此功能的原型

bool get_param(int argc, char **argv, char *fname);

在这个例子中,我只使用一个参数。我的程序应该被调用为./voter -i voters.txt,其中votes.txt只是我稍后将要使用的文件。

在我的main函数中,我为名称文件创建变量char *fname,然后调用get_param(argc, argv, fname)

我得到的输出是

-i = randomfile.txt
-i = (null)

为什么?我在fname中为get_param动态分配空间,所以即使在我的函数结束后,该空间是不是应该“停留”?

以下是我的代码。

谢谢。

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

bool get_param(int argc, char **argv, char *fname);

int main(int argc, char **argv)
{
    char *fname;

    if (get_param(argc, argv, fname) == false)
        return -1;

    printf("-i = %s\n", fname);

    return 0;
}

bool get_param(int argc, char **argv, char *fname){

    if (argc != 3){
        printf("%s: wrong number of inline parameters\n", *argv);
        return false;
    }

    char i[] = "-i";
    if (strcmp(argv[1], i) == 0){
        fname = (char *)malloc((strlen(argv[2]) + 1)*sizeof(char));
        assert(fname != NULL);
        strcpy(fname, argv[2]);
        printf("-i = %s\n", fname);
        return true;
    }
    else {
        printf("%s: %s: no such parameter\n", *argv, argv[1]);
        return false;
    }

} 

2 个答案:

答案 0 :(得分:3)

Barfname的副本完全属于get_param的本地副本。它被初始化为从get_param传递的值(即未定义),但这就是全部。如果您要更新main中main的值,则需要传递地址,然后在fname中更新。

答案 1 :(得分:2)

只需将代码更改为 bool get_param(int argc,char argv,** char ** fname );

将调用更改为get_param(argc,argv,fname) to get_param(argc,argv,&amp; fname

并且get_param内部使用 * fname ,在函数内部使用fname。