0

最初の試み:

char* loadValues (char* str) {

  char* toReturn[5];

  .. some operations here ..

  return toReturn

}

これは明らかに警告を返し、関数の終了後にメモリの場所が解放されるため、適切に機能しません。

したがって、malloc を使用することを考えましたが、これが配列でどのように機能するかわかりません。

2 回目の試行:

char* loadValues (char* str) {

  char (*toReturn)[5] = malloc(sizeof *toReturn);

  .. some operations here ..

  return toReturn

}

mytoReturnには文字列が含まれています。たとえばtoReturn[0]"Hello"

なにか提案を?

4

2 に答える 2

3

私が理解している限りでは、ポインターの配列を返し、その配列の指す対象にメモリを割り当てたいと考えています。現在のコードでは、ローカルであるため、ポインターの配列を返すことはできません。次の方法でそれを行うことができます。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char** loadValues () {
  char** toReturn;
  int i;
  toReturn = malloc(5*sizeof(char*));
  for(i=0;i<5;i++)
  {
    toReturn[i] = malloc(25); //Change the size as per your need
    strncpy(toReturn[i], "string",i+1); //Something to copy
  }
  return toReturn;
}

int main()
{
  int i; 
  char **arr = loadValues();
  for(i=0;i<5;i++)
  {
    printf("%s\n", arr[i]);
  }

  for(i=0;i<5;i++)
  {
    free(arr[i]);
  }

  free(arr);
  return 0;  
}

の戻り値の型とloadValues、配列に割り当てられたメモリが で解放されることに注意してくださいmain


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void loadValues (char **toReturn) {
  int i;
  for(i=0;i<5;i++)
  {
    toReturn[i] = malloc(25); //Change the size as per your need
    strncpy(toReturn[i], "string",i+1); //Something to copy
  }
}

int main()
{
  int i; 
  char *arr[5];
  loadValues(arr);
  for(i=0;i<5;i++)
  {
    printf("%s\n", arr[i]);
  }

  for(i=0;i<5;i++)
  {
    free(arr[i]);
  }

  return 0;  
}

また、呼び出しがmalloc成功したかどうかを確認し、エラーを処理する必要があります。

于 2013-01-10T19:02:24.163 に答える
1

malloc は、メモリのチャンクを割り当てて先頭へのポインタを返すだけで機能します。ここで注意が必要なのは、作成している配列に文字が含まれておらず、文字へのポインターが含まれていることです。

char* toReturn[5] = malloc(memory);

私が見る限り、toReturn の 5 つの char ポインターに十分なメモリを malloc する必要があります。次に、要素を調べて、それらに必要と思われる量のメモリを malloc します。配列自体を解放する前に、配列をもう一度調べて、使い終わったらすべてのメモリを解放することを忘れないでください。

于 2013-01-10T18:49:14.667 に答える