【问题标题】:Trouble with unitialized pointer未初始化指针的问题
【发布时间】:2015-12-12 03:22:41
【问题描述】:

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

我正在制作一个包含一些命令行参数的程序,我决定 制作一个名为 get_param(...) 的函数,这样我的 main 中就没有很多行了。

这是这个函数的原型

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

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

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

我得到的输出是

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

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

下面是我的代码。

谢谢。

#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;
    }

} 

【问题讨论】:

  • 你为什么需要这些复杂的东西?您已经在argv[2] 中拥有文件名。

标签: c pointers command-line-arguments


【解决方案1】:

get_param 中的fname 的副本严格本地化为get_param。它被初始化为从main 传入的值(即未定义),仅此而已。如果要在main中更新fname的值,则需要传递地址,然后在get_param中更新。

【讨论】:

    【解决方案2】:

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

    将调用更改为 get_param(argc, argv, fname) 到 get_param(argc, argv, &fname)

    并且在 get_param 中使用 *fname 在函数中使用 fname 的任何地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多