These are just some of the Arrays sizes i've used, many of them are inside a loop.


int ss[80000]={0};
char pres[64000];

int ith[4096][16]={0},ich[4096]={0},pres2[2500][16]={0};


int slf[4096][16]={0},slr[4096]={0},rh=0,crs[4096]={0},cri=0,moo=0,nb=0;
int qlf[4096][16]={0},wlf[4096][16]={0},kd=0;
 
      
int jlf[4096][16]={0},jlr[4096]={0},jrs[4096]={0},jri=0;
int klf[4096][16]={0},klr[4096]={0},krs[1204]={0},kri=0;


int vlf[4096][16]={0},vlr[4096]={0},vrs[4096]={0},vri=0;
int plf[4096][16]={0},plr[4096]={0},prs[4096]={0},pri=0;

80% of the time my program runs properly but every other time it suddenly stops executing and closes the program unexpectedly and after debugging i always find out that one of the counters for the array has gone way off the limit, like ith[4096][16] will have values uptil ith[6400(counter)][16].

I also can't declare the size as a high upper limit of 6400 as the program refuses to run if i do this with every array. I thought about using Dynamic array but i've never used them before and am not sure of the right way to do it. I"ve seen a few examples online but my problem is the counter variable increases in different parts of the program including loops while processing the ith[][] variable itself it may increase its size, how do i define it then

int * ich;
ich = new int [Counter];

What about Multi-dimensional pointers with one fixed varaible ?

int ** ith;
ith = new int [Counter][16];

or 

ith =new int*[counter];
for(int i=0; i<16;i++){
ith[i]=new int[16];}

Are there better ways of solving my problem other than dyanmic array ? Can i constantly change the size of the arrar by using Dynamic allocation ?

What about Vectars ? Is it relatively easier to implement for an amateur?

Dani AI

Generated

The intermittent crashes and the fact that counters suddenly show indexes past declared limits (e.g. seeing values at ith[6400] when ith was declared with 4096 rows) point squarely to memory corruption rather than any “auto-growing” of static arrays. Many large local (stack) arrays plus a single out‑of‑bounds write will overwrite nearby variables or return addresses, producing exactly the non‑deterministic symptoms reported by . Stack vs. heap behavior and variable layout explain why the overrun sometimes looks like it “belongs” to a different array.

Safer storage and clearer layout remove the class of bugs that cause this. Follow ’s advice and use std::vector (or std::vector<std::array<int,16>> when the inner dimension is fixed) so large buffers live on the heap and initialization is explicit. Combine that with ’s grouping idea by making a small struct for related fields and keeping a std::vector<ThatStruct> — that keeps related data together and reduces accidental cross‑writes without raw pointer arithmetic.

Practical debugging and hardening steps: build with sanitizers (AddressSanitizer / UBSan) or run under Valgrind to catch the first out‑of‑bounds write; enable library debug checks (-D_GLIBCXX_DEBUG or MSVC iterator checks) during development; use vector::at() or assert(index < size()) for critical loops; and set a debugger watchpoint on the counter that becomes corrupted to catch the instruction that writes it. Remember that vector::resize changes size() (and can invalidate pointers/iterators) while reserve only preallocates capacity.

Final checklist: replace large local arrays with heap containers, prefer contiguous layouts (single vector or vector<array<...>>) for performance and predictability, remove any raw pointer arithmetic unless necessary, run sanitizers to find the offending write, and keep index variables and loop bounds explicit and of the correct type (use size_t for sizes). These steps will both stop the intermittent crashes and make the code much easier to reason about.

Recommended Answers

All 5 Replies

Remember, arrays are initialized with a strict size --unless they are dynamic. To access the memory for any array, you access it be 0 through one less than the total size.

int numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// numbers[0] = 1;
// numbers[9] = 10;
// numbers[10] = invalid due to accessing past the allocated memory - program will likely exit or give junk result

std::vectors aren't strictly needed, but they do take care of the dynamic memory allocation for you, and tend to do so in a reasonably efficient manner.

I'm curious though about what your application is, that it requires several large 2-dimensional arrays, and whether it would be worthwhile or appropriate to use a struct (or class, since this is the C++ development forum):

// instead of
int slf[4096][16]={0},slr[4096]={0},rh=0,crs[4096]={0},cri=0,moo=0,nb=0;
int qlf[4096][16]={0},wlf[4096][16]={0},kd=0;

// use the following
struct Datapoint {
    int slf[16], slr, crs;
    int qlf[16], wlf[16];
};
Datapoint p[4096];
int rh=0, cri=0, moo=0, nb=0;
int kd=0;

if, in fact, all of those variables (or more) are related in a way that it makes sense to group them.

... i always find out that one of the counters for the array has gone way off the limit, like ith[4096][16] will have values uptil ith[6400(counter)][16].

This has to do with the order in which you declare your arrays (that there is additional space after "ith" allocated for other arrays, so you can still index into that space), but why are you looking at ith[6400][16] if you only declared it up to [4096][16]? If there weren't other variables declared, you probably would have incurred a stack error and/or segment violation for trying to look into memory that didn't belong to your process.

Even for an expert, multi-D dynamic array accessing still writes lot lines.
But they know how to simplify it.

It is very easy to create,resize,and close a 1-D dynamic array with
malloc(),realloc() and free()
see


and use a calculation I call it "D-Bounce" to use it as multi-D dynamic array.
it works like this:

int arr[13][17][19];
arr[3][11][7]=7;
//can be replaced with
int*arr=(int*)malloc(13*17*19*sizeof(int))
arr[ 3*17 + 11*19 + 7 ]=7;

int arr[13][17][19];
arr[3][11][7]=7;
//can be replaced with
int*arr=(int*)malloc(13*17*19*sizeof(int))
arr[ 3*17 + 11*19 + 7 ]=7;

Hmmm, I think that indexing scheme should read:

arr[ 3*17*19 + 11*19 + 7 ] = 7;

Another advantage is that if you're frequently moving to an adjacent element, you can do things like:

int updown_offset = 17*19;
int northsouth_offset = 19;
int eastwest_offset = 1;

int *ptr = &arr[ 0*17*19 + 11*19 + 7 ];  // or whatever starting position
for (int updown=0; updown<13; updown++) {
    *ptr = 7;
    ptr += updown_offset;
}

Not really as readable as arr[k][11][7] = 7; , but the latter would require 3 adds and 3 pointer dereferences for each time through the loop, instead of 1 add and 1 dereference (and of course an add and a compare for the loop variable either way). It starts to matter when you're doing heavy math across every element in your multi-dimensional array!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.