簡體   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