从C

时间:2017-07-16 06:02:46

标签: c function pointers

编辑:提示两次不是因为函数中存在潜在错误,而是因为我缺乏关注,最终我调用了main()中的两个函数。但是,非常感谢那些指出我滥用malloc()sizeof的人。

我写了这个小C代码:

void * getWord()
{
  char * word_Input;
  printf("Enter a word: ");
  word_Input = malloc(6 * sizeof(char));
  scanf("%s", word_Input);
  printf("Your word was: %s\n", word_Input);
  return word_Input;
}

这对于要求用户输入并将其打印回屏幕的效果非常有效。

但是,如果我希望打印单词是另一个从getWord()函数获取输入的函数的一部分,如下所示:

void * getWord()
{
  char * word_Input;
  printf("Enter a word: ");
  word_Input = malloc(6 * sizeof(char));
  scanf("%s", word_Input);
  return word_Input;
}

void * returnWord()
{
  char * word_Output;
  word_Output = malloc(sizeof(getWord()));
  word_Output = getWord();
  printf("Your word was: %s\n", word_Output);
}

它实际上会提示我两次一个值,然后取第二个word_Input作为一个值。我不明白为什么会这样。此外,内存中地址的基本机制是什么使程序以这种方式运行? (或者它与此无关,它实际上是我误用C的结果)

2 个答案:

答案 0 :(得分:2)

你犯了几个错误。所以让我们列举一下:

  1. sizeof是编译时操作(1)。它将根据其操作数的类型评估为size_t常量。因此sizeof(getWord())sizeof(void*)相同。因此,您为单个指针分配存储空间。如果此行打印任何,则编译器非常错误。

  2. 这一行word_Output = getWord();实际上调用了该函数。因此,您为word_Output(从getWord()返回的值)分配一个新值,并丢失之前分配的值。你的程序有漏洞。

  3. 由于getWord已经分配,​​因此无需为结果分配更多存储空间。 returnWord函数可以简化为:

    void * returnWord()
    {
      char * word_Output = getWord();
      printf("Your word was: %s\n", word_Output);
      return word_Output;
    }
    

    这只会分配一次。它还将返回分配的字符串。您的原始代码指定了返回类型void*,但未返回任何内容。这导致程序具有未定义的行为。如果声明函数返回某些内容,则必须按顺序执行以使程序有效。

    如果您不想返回任何内容,请指定void返回类型(不是void*),并确保释放已分配的内存:

    void returnWord()
    {
      char * word_Output = getWord();
      printf("Your word was: %s\n", word_Output);
      free(word_Output);
    }
    

    (1)除了可变长度数组,但您不能在代码中使用它们。

答案 1 :(得分:0)

这里有几个问题。

首先,getWord()似乎被调用了两次。我认为这是因为您将其称为sizeof(getWord())而不是sizeof getWord()。后一种形式/表达形式是保证表达不被评估的形式。有关更多信息和更多信息的指示,请参阅cppreference

第二个问题是您正在分配word_Output然后将其丢弃。这足以说明

void * returnWord()
{
    char * word_Output;
    word_Output = getWord();
    printf("Your word was: %s\n", word_Output);
}

内存将在getWord中分配,而word_Output只会指向该内容。

最后,malloc(sizeof(getWord())不会按预期工作,因为您有兴趣分配6个字符,但您要分配getWord()的结果大小。是8个字节 - 指向char的指针的大小。