Define new function, array, struct etc inside of parameter of function call [duplicate]

纵饮孤独 提交于 2019-12-20 02:15:56

问题


If you had a function which took the following:

void foo(char **arr);

How can you do the following:

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

If this confuses you, in Java we do this by the following:

public void foo(String[] x);

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

Currently, I do the following in C which I hate because it looks really ugly:

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

foo(myArr);

回答1:


How can you do the following:

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

You nearly made it ... ;-)

If doing C99 or newer use a compound literal like this:

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

Mind that the called function (foo() here) has no clue how many elements the pointer array has, so you want to add a final null-pointer as sentinel:

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

Example:

#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;
}

This will print:

hello
my
friend

The compound literal is valid until the scope it got defined in is left (main() here). If you want to make sure it gets removed from the stack immediately after its usage put braces around the call to foo() creating a local scope/block:

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. */

  ...



回答2:


Java and C are different languages with different idioms.

If it were me, I'd refrain from trying [too hard] to coerce C into "Java-like". Embrace each language on its own merits.

For your first example, the "ugly" one, you could use a CPP [C preprocessor] macro--a concept that does not exist in Java:

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

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

But, this would probably be regarded by many as "too cute". Better to create a table of some sort.

Whenever Java does a new it is doing a heap allocation [which is slow]. That's partly because everything has to be "on the heap", more or less.

C can do this with malloc, but a good C programmer will try to avoid unnecessary heap allocations because it has globals, statics, and function scoped variables.




回答3:


You must be just another victim of the people that start with java and then trying to get into c, that's why I will answer.

I want to initialize my array inside of that parameter. How can that be done?

You cannot. prior to C99


In general, this is something you could do:

#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;
}

where foo() uses the size of the array explicitly, while bar() requires the array to be NULL terminated.



来源:https://stackoverflow.com/questions/39177106/define-new-function-array-struct-etc-inside-of-parameter-of-function-call

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!