2016-08-27 1 views
3

Если вы имели функцию, которая приняла следующее:Определить новую функцию, массив, структура и т.д. внутри параметра вызова функции

void foo(char **arr); 

Как вы можете сделать следующее:

void foo(char* x[] = { "hello", "my", "friend" }); 

Если это вас смущает, в Java мы делаем это следующим:

public void foo(String[] x); 

foo(new String[] { "hello", "my", "friend" }); 

в настоящее время, я следующий в C, который я ненавижу becaus е это выглядит действительно некрасиво:

char* myArr[] = 
    { 
     "hello", "my", "friend" 
    }; 

foo(myArr); 
+1

Я бы любезно совет вы спросить 2-й, совершенно не связан вопрос, в новом вопросе. Совет: сделайте некоторое исследование первым ... :) – gsamaras

+0

Короткий ответ: C не является Java. Некоторые вещи не могут быть выполнены на языке C так же, как в Java. Это одна из них. Вы найдете программистов C, которые будут благодарны за то, что это невозможно сделать на вашем Java-пути. – Peter

ответ

5

Как вы можете сделать следующее:

void foo(char* x[] = { "hello", "my", "friend" }); 

Вы почти сделали это ...;-)

Если делать C99 или более новую версию использовать соединение буквального следующим образом:

foo((char *[]){"hello", "my", "friend"}); 

ум, что вызываемая функция (foo() здесь) не имеет ни малейшего представления, сколько элементов массив указателей есть, так что вы хотите добавить последний нуль-указатель, как часовой:

foo((char *[]){"hello", "my", "friend", NULL}); 

Пример:

#include <stdio.h> 
#include <stdlib.h> /* for EXIT_xxx macros */ 


void foo(char **arr) 
{ 
    while (arr && *arr) 
    { 
    printf("%s\n", *arr); 
    ++arr; 
    } 
} 

int main(void) 
{ 
    foo((char *[]){"hello", "my", "friend", NULL}); /* Mind the final NULL. */ 

    return EXIT_SUCCESS; 
} 

Это будет печатать:

hello 
my 
friend 

Соединение буквальным действует до тех пор, сфера он получил определенный в не осталось (main() здесь). Если вы хотите, чтобы убедиться, что он получает удаляется из стека сразу же после его использования поставить брекеты вокруг вызова foo() создания локальной области видимости/блок:

int main(void) 
{ 
    { 
    foo((char *[]){"hello", "my", "friend", NULL}); /* Mind the final NULL. */ 
    } 

    /* The compound literal passed to foo() is already deallocated here, had been 
    removed from the stack. */ 

    ... 
3

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

Я хочу инициализировать мой массив внутри этого параметра. Как это можно сделать?

Вы не можете. до C99


В общем, это то, что вы могли бы сделать:

#include <stdio.h> 

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

void bar(char** arr) 
{ 
    while(*arr) 
     printf("%s\n", *arr++); 
} 

int main(void) 
{ 
    char* x[] = { "hello", "my", "friend" }; 
    foo(x, 3); 

    char* null_terminated[] = { "ShadowRanger", "Correct", NULL }; 
    bar(null_terminated); 

    return 0; 
} 

где foo() использует размер массива в явном виде, в то время как bar() требует массив быть NULL прекращается.

+0

Прошу прощения, но, похоже, вы не читали мой вопрос. Смотрите, где вы ввели 'foo (x, 3)'? Я хочу инициализировать мой массив ** внутри ** этого параметра. Как это можно сделать? – Hatefiend

+2

@Hatefiend я сделал. Ты не можешь. – gsamaras

+0

Альтернативой проходящей длине является добавление «NULL» до конца массива 'char *', поэтому 'foo' может продолжаться до тех пор, пока' arr [i] 'не будет' NULL'. Явная длина обычно лучше, но часовые иногда полезны. – ShadowRanger

5

Java и C - это разные языки с разными идиомами.

Если бы это был я, я бы воздержался от попыток [слишком сложно] принудить C к «Java-like». Обнимите каждый язык по существу.

Для первого, например, "некрасиво" один, вы можете использовать [препроцессор C] CPP макро --a концепция, которая делает не существует в Java:

#define FOO(_av...) \ 
    do { \ 
     char *myArr[] = { _av, NULL }; \ 
     foo(myArr); \ 
    } while (0) 

FOO("hello", "my", "friend"); 

Но это вероятно, многие считают «слишком милыми». Лучше создать какую-то таблицу.

Всякий раз, когда Java делает new, он выполняет распределение кучи [которое медленно]. Отчасти потому, что все должно быть «на куче», более или менее.

C может сделать это с помощью malloc, но хороший программист C попытается избежать ненужных распределений кучи, поскольку он имеет глобальные переменные, статистические данные и функции.

+1

«Но это, вероятно, многие считают« слишком милыми ».» Или слишком ...: P: P: P В любом случае, хорошо, что у нас есть альтернатива моему ответу, +1 .. :) – gsamaras

Смежные вопросы