繁体   English   中英

C-从函数返回数组

[英]C - Returning an array from a function

我正在尝试创建一个函数,该函数以C语言返回一个字符串数组。我在网站上查看了其他一些问题,并尝试了一些解决方案,但似乎没有任何效果。 我试过(1)只是简单地更改函数以更改数组内容而不是返回它,并且我试过(2)显式地返回arrayz,但似乎都不起作用。 方法#1:在一个文件中,该函数:

 int getArray(int num, char** array)
    {
        int i;
        for (i = 0; i < num; i++)
            array[i] = "whatever";
        return 0;
    }

在另一个文件中,我调用该函数:

char** array = malloc(sizeof(char*) * num));
getArray(num, files);

当我尝试打印阵列文件的内容时,什么都没有显示。 方法2:在一个文件中,该函数:

 char** getArray(int num)
    {
        int i;
        char** array = malloc(sizeof(char*) * num));
        for (i = 0; i < num; i++)
            array[i] = "whatever";
        return array;
    }

在另一个文件中,我调用该函数:

    char** files = getArray(num);

同样,当我尝试打印文件内容时,什么也没有显示。

我已经检查过,并且在其中定义getFiles()的头文件已包含在进行调用的文件中。 我不确定发生了什么。

您将数组命名为“数组”,而不是“文件”:

char** array = malloc(sizeof(char*) * num));
getArray(num, files);

尝试

getArray(num, array);
char** array = malloc(sizeof(char*) * num));

在这里,您为num char指针分配内存,但不存储num字符串。 您还需要为字符串分配内存。 即“无论存储什么”。
而且你不能分配一个字符串,

 array[i] = "whatever";

你应该用

strcpy(array[i],"whatever");

您实际上需要为字符串分配空间。 您只是为指向字符串的指针分配内存。 在您提供的示例中,您可以使用strdup任何字符串分配空间。 像这样:

int getArray(int num, char** array)
{
    int i;
    for (i = 0; i < num; i++)
        array[i] = strdup("whatever");
    return 0;
}

我不知道你想做什么。 但是我想你就是这样。

#include <stdio.h>

char** getArray(int num)
{
  int i;
  char** array = malloc(sizeof(char*) * num);
  char* whatever = "whatever";

  for (i = 0; i < num; i++)
  {
    array[i] = whatever;
    //    array[i][0] = '0' + i;//Comment out because "whatever" is now constant that is immutable. So you can't change it.
  }
  return array;
}

main(){
  char** arr;
  int i;
  arr = getArray(10);
  for(i=0; i<10; i++)
  {
    printf("addr=%d, val=%s\n",arr[i], arr[i]);
  }
}

输出:

addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever
addr=39075716, val=whatever

这个可以吗? 在上述情况下, arr[i]是只读的,仅指向一个存储空间。 有时这是非常有效的内存。

但我认为您想这样做。

#include <stdio.h>

char** getArray(int num)
{
  int i;
  char** array = malloc(sizeof(char*) * num);
  char* whatever;

  for (i = 0; i < num; i++)
  {
    whatever = malloc(sizeof(char) * (strlen("whatever")+1));
    strcpy(whatever, "whatever");//Now you can change "whatever". Because you created new readable-writable memory space by using malloc.
    array[i] = whatever;
    array[i][0] = '0' + i;//Now You can change array[i].
  }
  return array;
}

main(){
  char** arr;
  int i;
  arr = getArray(10);
  for(i=0; i<10; i++)
  {
    printf("addr=%d, val=%s\n",arr[i], arr[i]);
  }
}

输出:

addr=-356501104, val=0hatever
addr=-356501088, val=1hatever
addr=-356501072, val=2hatever
addr=-356501056, val=3hatever
addr=-356501040, val=4hatever
addr=-356501024, val=5hatever
addr=-356501008, val=6hatever
addr=-356500992, val=7hatever
addr=-356500976, val=8hatever
addr=-356500960, val=9hatever

现在您可以更改arr[i]因为您使用了malloc并为新字符串(“ xhatever”)创建了内存空间。

希望对您有所帮助。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM