我目前正在从事一个学校项目。我必须开发一个控制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;
}
在您的代码中,您返回本地变量。这是个坏主意,因为在此函数的外部,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) {}
您应该动态创建ipv4数组,因为它是本地的。
char **ipv4 =( int**)malloc(sizeof (char*)*4);
用于分配4行。
ipv4[i]=(char*)malloc(sizeof(char)*3);
用于在每个“ i”行中分配3列。
因此我们创建了ipv4 [4] [3]。像这样返回
return ipv4
如果可以,请避免...
数组不是C语言的一等公民,也不是多D语言的公民,因此您只能返回指向其第一个元素的指针。除了不能使用sizeof
之外,它几乎可以与真正的数组一样使用,并且当您返回指向自动数组的指针时,该数组将在函数返回时终止其生存期,并且调用方将剩下一个悬空指针。有3种方法可以从C中的函数return数组:
返回静态数组
它解决了悬挂指针问题,但导致了非线程安全功能
返回分配的数组
它也解决了线程问题,但是:
让调用者提供数组及其大小
这样,调用方就可以完全控制内存的类型(自动,静态或动态),并且如果您还传递其维数,则可以轻松使用多维数组。