C - 从函数返回数组

时间:2014-04-02 14:37:40

标签: c arrays string

我试图在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()的头文件已包含在我拨打电话的文件中。我不确定发生了什么。

4 个答案:

答案 0 :(得分:1)

您将数组命名为&#34;数组&#34;,而不是&#34;文件&#34;:

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

尝试

getArray(num, array);

答案 1 :(得分:0)

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

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

 array[i] = "whatever";

你应该使用,

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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”)。

我希望它有所帮助。 :)