Заполните выходной параметр C - PullRequest
6 голосов
/ 01 марта 2012

Это вопрос новичка, но, пожалуйста, потерпите меня. Я хотел бы передать char * в функцию и заполнить ее содержимым нескольких существующих строк. Вот что у меня есть (и не работает)

int func(char *out) {
    int i;
    int x = 10;
    int y = 10;
    char array[x][y];

    out = malloc(x * y + x);
    memset(out, 0x00, strlen(out));
    for (i=0; i<x; i++) {
            strcat(out, array[i]);
            strcat(out, "\n");
    }
}

//main
    char *result;
    func(result);

Ответы [ 2 ]

10 голосов
/ 01 марта 2012

A char* - это просто указатель, передача его не позволяет снова передать новый.Вам нужно передать char** примерно так:

void get_name( char** ppname ){
  char * pname = strdup("my name is fred");
  *ppname = pname;
}

Затем вы передаете функцию куда-нибудь, чтобы поместить указатель так:

char * name;
get_name( &name );
printf( "got '%s'\n", name );
free( name );
0 голосов
/ 01 марта 2012

Это не работает, потому что вы никогда не выделяли память для своей переменной result - это просто указатель, указывающий в никуда.

char result[1000]; // change size as needed if you know the size ahead of time
func(result);

или

char *pResult = malloc ( 1000 ); // allocate dynamically

if ( pResult != NULL )
    func ( pResult );

...

if ( pResult != NULL )
    free ( pResult );

Вы должнытакже передайте размер буфера, чтобы ваша функция func могла проверить и убедиться, что для ее вывода достаточно места.

Оба эти решения предполагают, что вы выделяете буфер вне func.Если вы хотите выделить выходной буфер внутри func, чем - как предлагает Als - вам нужно передать указатель на указатель.В этом случае вам также следует вернуть размер буфера, чтобы вызывающая сторона знала, сколько байтов доступно в буфере.

...