473,394 Members | 1,718 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,394 software developers and data experts.

Help with array/pointer segmentation fault needed

Ben
Hi,

I am having trouble debugging a segmentation fault...here's my data structure:

typedef struct CELL *pCELL; /* Pointers to cells */
struct CELL {
SYMBOL symbol;
pCELL prev_in_block;
pCELL next_in_block;
pCELL prev_in_column;
pCELL next_in_column;
pCELL prev_in_row;
pCELL next_in_row;
};
pCELL mArray[MAX2][MAX][MAX][MAX2]; /* The multi-dimensional array */
So, mArray is an array of pointers to CELLs. And each CELL contains a symbol and pointers to the neighbouring CELLs. I am
representing a 4d "grid" here, but you can think of it like a 2d one.

Note the boundary CELLS should not point to anything, e.g. the first piece in a row should have a prev_in_block value of NULL,
meaning the address of the CELL it points to is NULL, meaning there's no such CELL.

Ok, my problem comes when trying to ACCESS symbols via the pointers, e.g. printing out the symbol in a "square" in the grid and
all of it's surrounding symbols. Then I get an intermittent seg fault. This first line is always ok:

value = mArray[bb][cc][rr][vv]->symbol;

But one or more of the following will cause a seg fault:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
nib = mArray[bb][cc][rr][vv]->next_in_block->symbol;
pic = mArray[bb][cc][rr][vv]->prev_in_column->symbol;
nic = mArray[bb][cc][rr][vv]->next_in_column->symbol;
pir = mArray[bb][cc][rr][vv]->prev_in_row->symbol;
nir = mArray[bb][cc][rr][vv]->next_in_row->symbol;
I can't find a particular pattern with this, different "squares" (changing bb,cc etc) crash it at different lines - it seems to
be no relation to which squares have a NULL pointer for example.

But, some of the statements above work correctly some of the time...leading me to believe I have the syntax correct. So what
could be the issue? If there's any other information needed happy to provide.

cheers,

Ben
Jun 9 '06 #1
8 2105
Ben
Ben wrote:
Hi,

I am having trouble debugging a segmentation fault...here's my data
structure:

typedef struct CELL *pCELL; /* Pointers to cells */
struct CELL {
SYMBOL symbol;
pCELL prev_in_block;
pCELL next_in_block;
pCELL prev_in_column;
pCELL next_in_column;
pCELL prev_in_row;
pCELL next_in_row;
};
pCELL mArray[MAX2][MAX][MAX][MAX2]; /* The multi-dimensional array */
So, mArray is an array of pointers to CELLs. And each CELL contains a
symbol and pointers to the neighbouring CELLs. I am representing a 4d
"grid" here, but you can think of it like a 2d one.

Note the boundary CELLS should not point to anything, e.g. the first
piece in a row should have a prev_in_block value of NULL, meaning the
address of the CELL it points to is NULL, meaning there's no such CELL.

Ok, my problem comes when trying to ACCESS symbols via the pointers,
e.g. printing out the symbol in a "square" in the grid and all of it's
surrounding symbols. Then I get an intermittent seg fault. This first
line is always ok:

value = mArray[bb][cc][rr][vv]->symbol;

But one or more of the following will cause a seg fault:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
nib = mArray[bb][cc][rr][vv]->next_in_block->symbol;
pic = mArray[bb][cc][rr][vv]->prev_in_column->symbol;
nic = mArray[bb][cc][rr][vv]->next_in_column->symbol;
pir = mArray[bb][cc][rr][vv]->prev_in_row->symbol;
nir = mArray[bb][cc][rr][vv]->next_in_row->symbol;
I can't find a particular pattern with this, different "squares"
(changing bb,cc etc) crash it at different lines - it seems to be no
relation to which squares have a NULL pointer for example.

But, some of the statements above work correctly some of the
time...leading me to believe I have the syntax correct. So what could be
the issue? If there's any other information needed happy to provide.

cheers,

Ben

Correction, my late night testing was obviously a little flawed. The above lines do only crash when trying to access one of the
"NULL pointers"...so I guess I can do something like this:

pointer = mArray[bb][cc][rr][vv]->prev_in_block;
if (pointer != NULL) pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
else pib = '_';

But is there a better way? Too many ifs already in this program :)
Jun 9 '06 #2
Ben wrote:
[...]
But one or more of the following will cause a seg fault:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
nib = mArray[bb][cc][rr][vv]->next_in_block->symbol;
pic = mArray[bb][cc][rr][vv]->prev_in_column->symbol;
nic = mArray[bb][cc][rr][vv]->next_in_column->symbol;
pir = mArray[bb][cc][rr][vv]->prev_in_row->symbol;
nir = mArray[bb][cc][rr][vv]->next_in_row->symbol;
[...] Correction, my late night testing was obviously a little flawed. The
above lines do only crash when trying to access one of the
"NULL pointers"...so I guess I can do something like this:

pointer = mArray[bb][cc][rr][vv]->prev_in_block;
if (pointer != NULL) pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
else pib = '_';

But is there a better way? Too many ifs already in this program :)


Several things. First, don't recalculate "mArray[bb][cc][rr][vv]" for
each line. Even if the compiler optimizes it to only once, it makes
your source more cluttered.

Second, you can use the "?:" operator. In your example using "pib"
above, this can be written:

pib = (mArray[bb][cc][rr][vv]->prev_in_block == NULL) ? '_'
: mArray[bb][cc][rr][vv]->prev_in_block->symbol;

Combining the two, and using a simple macro-wrapper, you have:

========== (Untested)

pCELL *pcell;

pcell = mArray[cc][cc][rr][vv];
#define DOIT(dest,src) \
dest = ( (pcell->what == NULL ) ? '_' : pcell->what->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
...
#undef DOIT

==========

--
+-------------------------+--------------------+-----------------------+
| Kenneth J. Brody | www.hvcomputer.com | #include |
| kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h> |
+-------------------------+--------------------+-----------------------+
Don't e-mail me at: <mailto:Th*************@gmail.com>
Jun 9 '06 #3
Ben
Kenneth Brody wrote:
Ben wrote:
[...]
But one or more of the following will cause a seg fault:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
nib = mArray[bb][cc][rr][vv]->next_in_block->symbol;
pic = mArray[bb][cc][rr][vv]->prev_in_column->symbol;
nic = mArray[bb][cc][rr][vv]->next_in_column->symbol;
pir = mArray[bb][cc][rr][vv]->prev_in_row->symbol;
nir = mArray[bb][cc][rr][vv]->next_in_row->symbol;

[...]
Correction, my late night testing was obviously a little flawed. The
above lines do only crash when trying to access one of the
"NULL pointers"...so I guess I can do something like this:

pointer = mArray[bb][cc][rr][vv]->prev_in_block;
if (pointer != NULL) pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
else pib = '_';

But is there a better way? Too many ifs already in this program :)


Several things. First, don't recalculate "mArray[bb][cc][rr][vv]" for
each line. Even if the compiler optimizes it to only once, it makes
your source more cluttered.

Second, you can use the "?:" operator. In your example using "pib"
above, this can be written:

pib = (mArray[bb][cc][rr][vv]->prev_in_block == NULL) ? '_'
: mArray[bb][cc][rr][vv]->prev_in_block->symbol;

Combining the two, and using a simple macro-wrapper, you have:

========== (Untested)

pCELL *pcell;

pcell = mArray[cc][cc][rr][vv];
#define DOIT(dest,src) \
dest = ( (pcell->what == NULL ) ? '_' : pcell->what->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
...
#undef DOIT

==========

Thanks, I think I can cut my program by 400 lines with this
Jun 10 '06 #4
Ben
Kenneth Brody wrote:
Ben wrote:
[...]
But one or more of the following will cause a seg fault:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
nib = mArray[bb][cc][rr][vv]->next_in_block->symbol;
pic = mArray[bb][cc][rr][vv]->prev_in_column->symbol;
nic = mArray[bb][cc][rr][vv]->next_in_column->symbol;
pir = mArray[bb][cc][rr][vv]->prev_in_row->symbol;
nir = mArray[bb][cc][rr][vv]->next_in_row->symbol;

[...]
Correction, my late night testing was obviously a little flawed. The
above lines do only crash when trying to access one of the
"NULL pointers"...so I guess I can do something like this:

pointer = mArray[bb][cc][rr][vv]->prev_in_block;
if (pointer != NULL) pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
else pib = '_';

But is there a better way? Too many ifs already in this program :)


Several things. First, don't recalculate "mArray[bb][cc][rr][vv]" for
each line. Even if the compiler optimizes it to only once, it makes
your source more cluttered.

Second, you can use the "?:" operator. In your example using "pib"
above, this can be written:

pib = (mArray[bb][cc][rr][vv]->prev_in_block == NULL) ? '_'
: mArray[bb][cc][rr][vv]->prev_in_block->symbol;

Combining the two, and using a simple macro-wrapper, you have:

========== (Untested)

pCELL *pcell;

pcell = mArray[cc][cc][rr][vv];
#define DOIT(dest,src) \
dest = ( (pcell->what == NULL ) ? '_' : pcell->what->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
...
#undef DOIT

==========


Having a go at this, I am getting "assignment makes pointer from integer without a cast" errors from the lines starting with DOIT.

pCELL pointer,pib,nib,pic;
pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

Note that type pCELL IS a pointer to CELL structures, so

pCELL pointer,pib,nib,pic;

should be correct.

I would have thought that dest, should actually be *dest since we are assigning a value to a pointer, but am not familiar enough
with macros (or C) to know if this should work. Can anyone else see the problem? Here's the full code I am using to test:

#include <stdio.h>
#include <stdlib.h>

#define MAX 8
#define MAX2 64

typedef char SYMBOL;
typedef struct CELL *pCELL;
struct CELL {
SYMBOL symbol;
int block,column,row;
pCELL prev_in_block;
pCELL prev_in_column;
pCELL prev_in_row;
pCELL next_in_block;
pCELL next_in_column;
pCELL next_in_row;
pCELL next_in_vector;
pCELL next_in_puzzle;
};
pCELL mArray[MAX2][MAX][MAX][MAX2];

int main(void) {

pCELL pointer,pib,nib,pic;
pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

return 0;
}
Jun 11 '06 #5
Ben wrote:
[...]
Having a go at this, I am getting "assignment makes pointer from
integer without a cast" errors from the lines starting with DOIT.

pCELL pointer,pib,nib,pic;
pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

Note that type pCELL IS a pointer to CELL structures, so

pCELL pointer,pib,nib,pic;

should be correct. [...] typedef char SYMBOL;

[...]

Well, since pib/nib/pic/etc are all type pCELL (ie: a pointer to CELL),
and both '_' and "...->symbol" are of type SYMBOL (ie: char), what is it
that you are trying to do with the assignment?

Your original post didn't specify what SYMBOL is not what type pib is,
so I had to assume that the assignment was okay. (You didn't say that
you were getting any errors/warnings on the compile.)

Taking a line from your original post:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;

The macro should be expanding to the same assignment, with the NULL
check as you discovered you needed.

--
+-------------------------+--------------------+-----------------------+
| Kenneth J. Brody | www.hvcomputer.com | #include |
| kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h> |
+-------------------------+--------------------+-----------------------+
Don't e-mail me at: <mailto:Th*************@gmail.com>

Jun 12 '06 #6

"Ben" <be*********@spam.me> wrote in message
news:12*************@corp.supernews.com...
Hi,

I am having trouble debugging a segmentation fault...here's my data
structure:

typedef struct CELL *pCELL; /* Pointers to cells */
struct CELL {
SYMBOL symbol;
pCELL prev_in_block;
pCELL next_in_block;
pCELL prev_in_column;
pCELL next_in_column;
pCELL prev_in_row;
pCELL next_in_row;
};
pCELL mArray[MAX2][MAX][MAX][MAX2]; /* The multi-dimensional array */
So, mArray is an array of pointers to CELLs. And each CELL contains a
symbol and pointers to the neighbouring CELLs. I am representing a 4d
"grid" here, but you can think of it like a 2d one.

Note the boundary CELLS should not point to anything, e.g. the first piece
in a row should have a prev_in_block value of NULL, meaning the address of
the CELL it points to is NULL, meaning there's no such CELL.

Ok, my problem comes when trying to ACCESS symbols via the pointers, e.g.
printing out the symbol in a "square" in the grid and all of it's
surrounding symbols. Then I get an intermittent seg fault. This first line
is always ok:

value = mArray[bb][cc][rr][vv]->symbol;

But one or more of the following will cause a seg fault:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;
nib = mArray[bb][cc][rr][vv]->next_in_block->symbol;
pic = mArray[bb][cc][rr][vv]->prev_in_column->symbol;
nic = mArray[bb][cc][rr][vv]->next_in_column->symbol;
pir = mArray[bb][cc][rr][vv]->prev_in_row->symbol;
nir = mArray[bb][cc][rr][vv]->next_in_row->symbol;
I can't find a particular pattern with this, different "squares" (changing
bb,cc etc) crash it at different lines - it seems to be no relation to
which squares have a NULL pointer for example.

But, some of the statements above work correctly some of the
time...leading me to believe I have the syntax correct. So what could be
the issue? If there's any other information needed happy to provide.

cheers,

Ben


You declared mArray as a 4D array of pointers. Yet you haven't pointed any
of the members to anything. Thus mArray[bb][cc][rr][vv] is an uninitialized
pointer, so dereferencing it with the
-> operator leads to undefined behavior and usually crashes.
--
Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Technical Architect, Software Reuse Project
Jun 12 '06 #7
Ben
Kenneth Brody wrote:
Ben wrote:
[...]
Having a go at this, I am getting "assignment makes pointer from
integer without a cast" errors from the lines starting with DOIT.

pCELL pointer,pib,nib,pic;
pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

Note that type pCELL IS a pointer to CELL structures, so

pCELL pointer,pib,nib,pic;

should be correct.

[...]
typedef char SYMBOL;

[...]

Well, since pib/nib/pic/etc are all type pCELL (ie: a pointer to CELL),
and both '_' and "...->symbol" are of type SYMBOL (ie: char), what is it
that you are trying to do with the assignment?

Your original post didn't specify what SYMBOL is not what type pib is,
so I had to assume that the assignment was okay. (You didn't say that
you were getting any errors/warnings on the compile.)

Taking a line from your original post:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;

The macro should be expanding to the same assignment, with the NULL
check as you discovered you needed.


Yes, you're correct, pib etc should have been type SYMBOL, not pCELL...here's some (complete) working code for example:

#include <stdio.h>
#include <stdlib.h>

#define MAX 8 /* Maximum value of n */
#define MAX2 64 /* Maximum value of n2 */

typedef char SYMBOL;
typedef struct CELL *pCELL;
struct CELL {
SYMBOL symbol;
int block,column,row;
pCELL prev_in_block;
pCELL next_in_block;
pCELL prev_in_column;
};
pCELL mArray[MAX2][MAX][MAX][MAX2];

int main(void) {

pCELL pointer;
SYMBOL pib,nib,pic;

pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

return 0;
}
Jun 13 '06 #8
Ben
Kenneth Brody wrote:
Ben wrote:
[...]
Having a go at this, I am getting "assignment makes pointer from
integer without a cast" errors from the lines starting with DOIT.

pCELL pointer,pib,nib,pic;
pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

Note that type pCELL IS a pointer to CELL structures, so

pCELL pointer,pib,nib,pic;

should be correct.

[...]
typedef char SYMBOL;

[...]

Well, since pib/nib/pic/etc are all type pCELL (ie: a pointer to CELL),
and both '_' and "...->symbol" are of type SYMBOL (ie: char), what is it
that you are trying to do with the assignment?

Your original post didn't specify what SYMBOL is not what type pib is,
so I had to assume that the assignment was okay. (You didn't say that
you were getting any errors/warnings on the compile.)

Taking a line from your original post:

pib = mArray[bb][cc][rr][vv]->prev_in_block->symbol;

The macro should be expanding to the same assignment, with the NULL
check as you discovered you needed.


Yes, you're correct, pib etc should have been type SYMBOL, not pCELL...here's some (complete) working code for example:

#include <stdio.h>
#include <stdlib.h>

#define MAX 8 /* Maximum value of n */
#define MAX2 64 /* Maximum value of n2 */

typedef char SYMBOL;
typedef struct CELL *pCELL;
struct CELL {
SYMBOL symbol;
int block,column,row;
pCELL prev_in_block;
pCELL next_in_block;
pCELL prev_in_column;
};
pCELL mArray[MAX2][MAX][MAX][MAX2];

int main(void) {

pCELL pointer;
SYMBOL pib,nib,pic;

pointer = mArray[0][0][0][0];

#define DOIT(dest,src) \
dest = ( (pointer->src==NULL) ? '_' : pointer->src->symbol )
DOIT(pib,prev_in_block);
DOIT(nib,next_in_block);
DOIT(pic,prev_in_column);
#undef DOIT

return 0;
}
Jun 13 '06 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Goh, Yong Kwang | last post by:
I'm trying to create a function that given a string, tokenize it and put into a dynamically-sized array of char* which is in turn also dynamically allocated based on the string token length. I...
19
by: Mark Richards | last post by:
I've been programming for many years, but have only recently taken a deep "C" dive (bad pun, i know) and need a lot of explanation from an expert. My questions center around those mysterious...
5
by: Fra-it | last post by:
Hi everybody, I'm trying to make the following code running properly, but I can't get rid of the "SEGMENTATION FAULT" error message when executing. Reading some messages posted earlier, I...
5
by: skumar434 | last post by:
Hi everybody, I am faceing problem with strings. The code is given bellow .In this program i am tring to copy data from a file into structure . I am able to copy the data ,but the dat is...
10
by: Rav | last post by:
I have recently started working on GCC on red Hat 9. I have encountered with some problems that i think should not occur (at least on Turbo C), here they r: Why does the following piece of code...
5
by: totoro2468 | last post by:
Here is a code I am writing. I keep geting segmentation fault. I'm not sure what i'm doing wrong. Can you explain it to me in PLAIN ENGLISH?? void ReadString (char *filename, int *lengthPtr,...
4
by: Christian Maier | last post by:
Hi After surfing a while I have still trouble with this array thing. I have the following function and recive a Segmentation fault, how must I code this right?? Thanks Christian Maier
21
by: subramanian100in | last post by:
Suppose we have char array; C allows taking the address of array (ie &array is valid) though the element array cannot be accessed. Is this allowed for use in binary search method (as given...
9
by: weidongtom | last post by:
Hi, I've written the code that follows, and I use the function add_word(), it seems to work fine *before* increase_arrays() is called that uses realloc() to allocate more memory to words. But...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.