返回char **或传递char *的数组

时间:2015-03-18 17:07:42

标签: c++ c arrays pointers

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

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]);
}

我实际获得的是数组中添加的最新值。!!酒花 我主要尝试定义:

char* out[10]

并传递它,但同样我总是得到相同的输出。 有什么建议 ?? 如果你能帮助我,请问如何从函数中返回char **?

***我不想使用字符串

提前致谢。

4 个答案:

答案 0 :(得分:1)

除了不为line分配内存之外,你正在这行做一个所谓的浅拷贝:

hops[i] = line;

这意味着您将指针line的值复制到hops[i],因此在循环结束时,hops的所有元素都指向同一位置在记忆中:line指向的地方。

您需要的是深层复印件。假设您在调用hops之前为Traceroute分配了内存,则可以使用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]);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您想要动态分配和复制每个char序列:

因此:

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

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

答案 3 :(得分:0)

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] );
}