13

I basically want to the C of equivalent of this (well, just the part with the array, I don't need the class and string parsing and all that):

public class Example
{
    static int[] foo;
    public static void main(String[] args)
    {
        int size = Integer.parseInt(args[0]);
        foo = new int[size]; // This part
    }
}

Pardon my C ignorance. I've been corrupted by java ;)

JM0
  • 340
  • 1
  • 13
Paul Wicks
  • 62,960
  • 55
  • 119
  • 146

6 Answers6

11
/* We include the following to get the prototypes for:
 * malloc -- allocates memory on the freestore
 * free   -- releases memory allocated via above
 * atoi   -- convert a C-style string to an integer
 * strtoul -- is strongly suggested though as a replacement
*/
#include <stdlib.h>
static int *foo;
int main(int argc, char *argv[]) {
    size_t size = atoi(argv[ 1 ]); /*argv[ 0 ] is the executable's name */
    foo = malloc(size * sizeof *foo); /* create an array of size `size` */
    if (foo) {  /* allocation succeeded */
      /* do something with foo */
      free(foo); /* release the memory */
    }
    return 0;
}

Caveat:Off the cuff stuff, without any error checking.

dirkgently
  • 108,024
  • 16
  • 131
  • 187
  • 1
    You should mention that "if (foo) free(foo);" is the "garbage collection". – Joel Mar 15 '09 at 21:03
  • 1
    There is no garbage collection in C. I'd be lying ;-) But I did put in some comments. – dirkgently Mar 15 '09 at 21:04
  • I don't think foo should be declared static, the meaning is different with java. Here we just want a global variable. – Ben Mar 15 '09 at 21:11
  • What's wrong with static? It's global (file scope), with internal linkage and IMHO much easier to understand for the OP than if I had written a smarter version (there'd be no globals). Also, this is an off-the-cuff version with a lot to left to be desired. – dirkgently Mar 15 '09 at 21:16
  • @dirkgently Your answer is very ok. I was just saying that declaring foo as an int * would have been enough. In java static is needed to declare a variable that will be instanciated only once, not once per new object. – Ben Mar 15 '09 at 21:27
  • I would do if(!foo) return 1; instead - that way it looks more like an error check, and you don't have to enclose your entire code block in brackets. But it's all personal taste. – Chris Lutz Mar 15 '09 at 23:20
  • As I have stated repeatedly, the code isn't my best. The atoi() to start with. And I don't much like multiple returns. YMMV. – dirkgently Mar 16 '09 at 06:44
5

In C, you can do that with this, if you ignore the error checking:

#include <stdlib.h>
static int *foo;

int main(int argc, char **argv)
{
     int size = atoi(argv[1]);
     foo = malloc(size * sizeof(*foo));
     ...
}

If you don't want a global variable and you are using C99, you could do:

int main(int argc, char **argv)
{
    int size = atoi(argv[1]);
    int foo[size];
    ...
}

This uses a VLA - variable length array.

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
4

Unfortunately, many of the answers to this question, including the accepted one, are correct but not equivalent to the OP's code snippet. Remember that operator new[] calls the default constructor for every array element. For POD types like int that do not have a constructor, they are default-initialized (read: zero-initialized, see §8.5 ¶5-7 of The C++ Standard).

I just exchanged malloc (allocate uninitialized memory) for calloc (allocate zeroed memory), so the equivalent to the given C++ snippet would be

#include <stdlib.h>  /* atoi, calloc, free */

int main(int argc, char *argv[]) {
    size_t size = atoi(argv[1]);
    int *foo;

    /* allocate zeroed(!) memory for our array */
    foo = calloc(sizeof(*foo), size);
    if (foo) {
        /* do something with foo */

        free(foo); /* release the memory */
    }

    return 0;
}

Sorry for reviving this old question but it just didn't feel right to leave without a comment (which I do not have the required rep for) ;-)

Jan
  • 293
  • 1
  • 11
2

If you need to initialize the data, you can use calloc:

int* arr = calloc (nb_elems, sizeof(int));
/* Do something with your array, then don't forget to release the memory */
free (arr);

This way, the allocated memory will be initialized with zeroes, which can be useful. Note that you can use any data type instead of int.

mirz
  • 21
  • 2
0
int count = getHowManyINeed();
int *foo = malloc(count * sizeof(int));
Chuck
  • 234,037
  • 30
  • 302
  • 389
0

You need int *a=calloc(n,sizeof(int)); when declaring the array in the function at runtime while implementing sorting algorithms. This will work in Turbo C++. Here I apply it in merge sort.

user16217248
  • 3,119
  • 19
  • 19
  • 37
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Nov 26 '22 at 15:49