struct sym_entry {
        struct rb_node          rb_node;
        struct list_head        node;
-       unsigned long           count[MAX_COUNTERS];
        unsigned long           snap_count;
        double                  weight;
        int                     skip;
        struct source_line      *lines;
        struct source_line      **lines_tail;
        pthread_mutex_t         source_lock;
+       unsigned long           count[0];
 };
 
 /*
 
 static inline struct symbol *sym_entry__symbol(struct sym_entry *self)
 {
-       return (struct symbol *)(self + 1);
+       return ((void *)self) + symbol__priv_size;
 }
 
 static void get_term_dimensions(struct winsize *ws)
 {
        int counter;
 
-       symbol__init(sizeof(struct sym_entry));
-
        page_size = sysconf(_SC_PAGE_SIZE);
 
        argc = parse_options(argc, argv, options, top_usage, 0);
        if (!nr_counters)
                nr_counters = 1;
 
+       symbol__init(sizeof(struct sym_entry) +
+                    (nr_counters + 1) * sizeof(unsigned long));
+
        if (delay_secs < 1)
                delay_secs = 1;