错误:return从整数生成指针

时间:2014-05-29 12:30:58

标签: c

我试图创建一个扫描字符串并创建一维字符串数组的函数。

编译时我遇到了这个错误:

  

return从没有强制转换的整数中生成指针

此功能的代码在这里:

char **insert_strings(int *n) {
    char **strings;
    char *string;
    strings=(char **)malloc((*n)*sizeof(char*));
    for(int i=0;i<(*n);i++)
        strings[i]=(char*)malloc(30*sizeof(char));
    for(int i=0;i<(*n);i++) {
        scanf("%s",string);
        strcpy(strings[i],string);
    }
    return **strings;
}

5 个答案:

答案 0 :(得分:4)

返回strings而不是**strings**stringschar

答案 1 :(得分:2)

根据上下文,无需取消引用strings,您应该使用return strings;

答案 2 :(得分:2)

您的函数被删除以返回指向char 的指针的指针,但您只返回 char

引起这种混淆是因为*一元运算符可以有两个含义:

  • 在变量和函数定义中,*表示:"this variable (or this function) is a pointer"。因此,char **insert_strings(int *n)返回指向char 指针的指针,而char **strings是指向char 指针的指针。

    < / LI>
  • 在定义之外,一元*运算符是引用运算符,而*a表示:"the object that is at the location indicated by the value of a"

    假设我们在计算机内存中存在这种情况:

    Addresses   1  |  2  |  3  |  4  |  5  |  6
    Values      5  |  3  |  6  |  9  |  2  |  9
    

    例如,如果变量strings地址(在您的代码中定义)为5,则其为2。 因此,*strings的值是位置2处的值,即3。 **strings*strings指向的位置的值。该 *strings的值为3,因此**strings的值为6.


话虽如此,我会解释你为什么会得到错误:insert_strings()应该返回指向char的指针的值,在你的代码中它是strings的值(2在我们的示例中),但是您返回**strings的值(在我们的示例中为6),这是一个char而不是指针。

要修复代码,您只需更改

即可
return **strings;

return strings;

您的代码还存在其他一些问题,这些问题不会导致编译时错误,但必须更正,因为它们可能会导致运行时错误。

  1. n不应该是指针。它正在计算您要输入的字符串数,因此它应该只是一个int。
  2. 你永远不应该, 从不 从不! 使用scanf()获取输入字符串;我会解释你为什么。在您的程序中,您为变量string分配30个字符的空间。现在,如果有人输入超过30个字符会发生什么?如果幸运的话,程序将终止。如果你不是,它可能会崩溃,你不知道在哪里找到这个bug。解决方案是使用fgets(char *s, int size, FILE *stream)。此功能是安全的,因为您可以告诉它用户可以输入多少个字符。在您的示例中,您将按如下方式使用它:fgets(string, 30, stdin);
  3. 最后,我想建议你做一些更好的计划:

    1. 检查malloc()的返回值,不要强制转换它:它是无用且冗余的。 (有关更多信息,请参阅Deduplicator对您的问题的评论)。
    2. sizeof(char) 始终等于1.编写它是没用的。
    3. 仅使用strings变量:您不需要string变量,如果没有它,您可以做得很好。
    4. 使用指向数组的指针而不是指向指针的指针。你事先知道一个字符串的维度,你不需要动态地分配它。

    5. 根据我的说法,你的代码应该是这样的:

      #include <stdio.h>     /* Needed for fgets()  */
      #include <stdlib.h>    /* Needed for malloc() */
      
      /* char **insert_strings(int n)
       * Gets n strings from input and puts them inside an array of strings.
       * Arguments: n is the number of lines that will be got from input.
       * Return value: the array of strings, or NULL if it couldn't be allocated. */
      char **insert_strings(int n)
      {
          /* strings is a pointer to array */
          char (*strings)[30];
      
          if((strings = malloc(n)) == NULL)
              return NULL;
      
          /* The loop that gets the input.
           * We use fgets() because it's safe.
           * 30 is the number of characters that we can get for every string.
           * stdin is the standard input, which is usually the keyboard. */
          for (int i = 0; i < n; i++)
              fgets(strings[i], 30, stdin);
      
          return strings;
      }
      

答案 3 :(得分:0)

你应该有返回字符串; (没有**)。一切都应该没问题。

答案 4 :(得分:0)

为什么要返回**字符串,当你已经把它作为(字符**)? 只返回String。这就足够了。