0

第一次尝试:

char* loadValues (char* str) {

  char* toReturn[5];

  .. some operations here ..

  return toReturn

}

这显然会返回警告并且无法正常工作,因为函数完成后内存位置将被释放。

所以我想到了使用 malloc,但是,我不明白这如何与数组一起使用。

第二次尝试:

char* loadValues (char* str) {

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

  .. some operations here ..

  return toReturn

}

我的toReturn包含字符串,例如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 的五个字符指针分配足够的内存,然后遍历元素并分配您认为需要的内存。在释放数组本身之前,请格外小心,记住再次遍历数组并释放所有内存。

于 2013-01-10T18:49:14.667 回答