【问题标题】:return char** or passing array of char*返回 char** 或传递 char* 数组
【发布时间】:2015-03-19 01:58:53
【问题描述】:

我想在以下方面获得帮助:

void Traceroute (char * hops[]){
   char* line = NULL;
   size_t len = 0;
   ssize_t read;
   int i = 0;
   while ((read = getline(&line, &len, fp)) != -1) {
        hops[i] = line;
       i++;
   }
   printf ("value1: %s value2: %s\n",hops[0],hops[1]);
}

我实际得到的是添加到数组中的最新值。!!酒花 我尝试在 main 中定义:

char* out[10]

并通过它,但我总是得到相同的输出。 有什么建议么 ?? 如果您也可以帮助我了解如何从函数返回 char **?

*** 我不想使用字符串

提前致谢。

【问题讨论】:

  • 混合 C 和 C++ 绝不是一个好主意..
  • 在我看来就像普通的 C 代码 - 为什么是 C++ 标记,我想知道?
  • 你的函数的返回类型是void,所以我不明白你想如何返回它。
  • 您不想想要使用字符串还是不能使用字符串?如果是前者,就需要丢掉这种心态。
  • 如果你不想使用std::string,就不要写C++。除了std::string,您还应该使用std::vectorstd::liststd::array,而不是原始数组。

标签: c++ c arrays pointers


【解决方案1】:

除了不为line 分配内存外,您还在此行中执行所谓的浅拷贝:

hops[i] = line;

这意味着你将指针line的值复制到hops[i],所以在循环结束时,hops的所有元素都指向内存中的相同位置:无论@987654326 @ 正在指向。

您需要的是深拷贝。假设你在调用Traceroute之前已经为hops分配了内存,你可以使用strcpy

strcpy(hops[i], line);

因为你不想使用std::string

再次,回到开始,您需要为line 分配足够的内存,以便能够保存文件的一行。比如:

line = (char *) malloc(MAX_LINE_LENGTH);

然后,在函数的最后:

free(line);

编辑:为hops 添加内存分配:

我假设您想在 Traceroute 之外执行此操作。因此,在调用该函数之前,请使用:

int i = 0;
const int nlines = 10;
char *hops[nlines];
for(i = 0; i < nlines; ++i)
    hops[i] = (char *) malloc(MAX_LINE_LENGTH);

然后,当您完成数组hops 后,您需要释放内存:

for(i = 0; i < nlines; ++i)
    free(hops[i]);

【讨论】:

  • 如果你用 hops 数组的内存分配描述扩展你的答案,我会赞成它
  • 感谢@GézaTörök 的建议,我对 C 的知识不是很了解,但希望我没有犯任何错误 :-)
  • 看起来很公平 :) +1
【解决方案2】:

getline 函数可以为您分配内存,但在每次调用之前将line 设置为 NULL 并将len 设置为 0。所以Traceroute 函数应该是这样的

int Traceroute( char *hops[], int size )
{
    char *line;
    size_t len;

    int i;
    for ( i = 0; i < size; i++ )
    {
        line = NULL;
        len = 0;
        if ( getline( &line, &len, fp ) < 0 )
            break;

        hops[i] = line;
    }

    return i;
}

应该这样称呼

int main( void )
{
    char *hops[10];

    int count = Traceroute( hops, 10 );
    for ( int i = 0; i < count; i++ )
        printf( "%s", hops[i] );
}

【讨论】:

    【解决方案3】:

    char* out[10] 只为 10 个字符的指针 分配空间。您将每一行读入同一位置 (line),并将该指针分配给数组的每个元素,因此它们都是相同的。但是你从来没有真正为这条线留出空间,更不用说为每条线单独留出空间,这意味着你在自找麻烦。

    【讨论】:

      【解决方案4】:

      您想动态分配和复制每个字符序列:

      因此:

      hops[i] = line;
      

      变成:

      size_t nSize = sizeof(char) * read; //Get the byte size of the data
      hops[i] = malloc(nSize); //Allocate the proper number of chars
      memcpy(hops[i], line, nSize); //Copy the data to that hops entry
      

      这是因为 line 处的数据在循环的每次迭代中都会被覆盖,并且由于 hops[i] 指向同一区域,因此 hops[i] 处的数据会被覆盖。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 2012-06-16
        • 2011-06-08
        相关资源
        最近更新 更多