从C函数中的数组返回项

时间:2015-03-08 21:03:26

标签: c arrays pointers

所以,我正在进行这个刽子手游戏。我对数组和指针有点麻烦。这就是我所拥有的:

char* getword(int index);
int main (void) {

char *secword =  getword(1);
printf("%s ", *secword);
}

char *getword(int index)
{
 char *words[8]= {'bye', 'hi','what', 'cat', 'dog',
                    'bird', 'air', 'water', 'fire'};
return words[index];
}

我不断收到分段错误(核心转储)错误。

3 个答案:

答案 0 :(得分:1)

你有四个重大错误

  1. 您不能在words函数之外使用getword(),因为它已在函数的堆栈帧中分配。

    因此,当函数返回时,数组将被释放,从而发生未定义的行为。

  2. 您的数组不包含字符串,而是多字符容器。 多字符常量是有效的,但是是实现定义的,因此您不能依赖它们来实现可移植程序。

    您的代码编译是因为您没有启用警告,然后当您尝试访问这些值的地址时,将依赖于多字符常量的实现的整数值分配给数组的poitners。打印它们然后发生未定义的行为。

  3. printf()期望每个char说明符都有"%s"指针,*secword的类型为char,因此它也错了,它& #39;再次编译,因为你没有启用编译器警告。

  4. 您正在使用9字而不是8初始化数组,这是编译器警告报告的另一个问题。

  5. 您有2个选项

    1. words函数

      中设置getword()静态
      const char *getword(int index);
      int main (void) 
      {
          char *secword =  getword(1);
          printf("%s\n", secword);
      }
      
      const char *getword(int index)
      {
           static const char *words[9] = {"bye",   "hi",  "what",  "cat", "dog",
                                          "bird", "air", "water", "fire"
           };
           return words[index];
      }
      
    2. 在main中声明words,并将其传递给getword()

      const char *getword(int index, const char *words[]);
      int main (void) 
      {
           const char *words[9] = {"bye",   "hi",  "what",  "cat", "dog",
                                   "bird", "air", "water", "fire"
           };
           char *secword = getword(1, words);
           printf("%s\n", secword);
      }
      
      const char *getword(int index, const char *words[])
      {
           return words[index];
      }
      
    3. 我现在已经编写了一段时间的c程序,并且我使用了与我的编译器可以提供的一样多的警告,如果我是一个新的程序员学习c,如果可能的话,我会启用更多的警告。

答案 1 :(得分:0)

char* getword(int index);

int main (void) {  
      char *secword =  getword(1);
      printf("%s ", secword);
}

char *getword(int index)
{
     static char *words[9]= {"bye", "hi","what", "cat", "dog",
                    "bird", "air", "water", "fire"};
    return words[index];
}

应该是这样的......

答案 2 :(得分:0)

您的计划有几个问题:

  1. 使用char*变量(或任何指针)时,必须始终首先使用malloc分配内存。不要忘记释放它。手动分配内存的替代方法是使用固定大小的数组。

  2. 打印时不要取消引用字符串(printf( "%s ", *secword ))。

  3. 确保在声明数组时指定正确数量的元素(有9个,而不是8个),并且不要忘记检查数组边界的步进。

  4. 在C中,所有字符串都是双引号;单引号表示字符常量。