如何在C函数中返回二维数组

问题描述 投票:0回答:2

我目前正在从事一个学校项目。我必须开发一个控制IP并制定其规格的程序。

我陷入了一个chari的双字母数组。我不知道如何正确归还它。

char** extraction_ip(char **ip){
   char *ch;
   char ipv4 [4][3];
   int i = 0;
   ch = *ip;
   *ipv4 [i]=strtok(ch, ".");
   while (ipv4 [i]!= NULL){
      i++;
      *ipv4 [i]=strtok(NULL, ".");
   }
   return ipv4;
}
c multidimensional-array
2个回答
0
投票

在您的代码中,您返回本地变量。这是个坏主意,因为在此函数的外部,ipv4可能不存在。

您可以将ip4定义为指针,然后为其分配指针。

char **ipv4 = malloc(sizeof(char *)*4); // that is allocation  for 4 pointer size.
if(!ipv4) {return NULL;} // exit function if you are failed to allocate for `ipv4`

另一件事,在您的代码中,您使用:

*ipv4 [i]=strtok(ch, ".");

应该是

ipv4 [i]=strtok(ch, ".");

因为,strtok返回字符串值/指针到字符(char *)而不是字符。

while循环应为i添加条件:

while (ipv4 [i]!= NULL && i < 4) {

因为我们为ip4分配了4个指针。

您还可以将ipv4作为函数的参数传递,然后不返回任何内容:

void extraction_ip(char **ipv4, char **ip) {}

0
投票

您应该动态创建ipv4数组,因为它是本地的。

char **ipv4 =( int**)malloc(sizeof (char*)*4);

用于分配4行。

ipv4[i]=(char*)malloc(sizeof(char)*3);

用于在每个“ i”行中分配3列。

因此我们创建了ipv4 [4] [3]。像这样返回

return ipv4

0
投票

如果可以,请避免...

数组不是C语言的一等公民,也不是多D语言的公民,因此您只能返回指向其第一个元素的指针。除了不能使用sizeof之外,它几乎可以与真正的数组一样使用,并且当您返回指向自动数组的指针时,该数组将在函数返回时终止其生存期,并且调用方将剩下一个悬空指针。有3种方法可以从C中的函数return数组:

  1. 返回静态数组

    它解决了悬挂指针问题,但导致了非线程安全功能

  2. 返回分配的数组

    它也解决了线程问题,但是:

    • 呼叫者必须处理免费呼叫
    • 分配真正的2D数组非常不容易
  3. 让调用者提供数组及其大小

    这样,调用方就可以完全控制内存的类型(自动,静态或动态),并且如果您还传递其维数,则可以轻松使用多维数组。

© www.soinside.com 2019 - 2024. All rights reserved.