Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > mystery of calloc with #define

Reply
Thread Tools

mystery of calloc with #define

 
 
a
Guest
Posts: n/a
 
      11-29-2007
By James Kuyper insightful suggestion, I identified my program error sources
from calloc.

I just don't know why for the following small program, I try different
JUDGEMENTDAY from 1,2,... and when it is >= 13, segmentation fault appears
if I don't force the program to exit by setting k to <= 11 in the last but 4
line. I guess the program is accessing something invalid but just don't know
why this happens.

#define SIZE 12
#define JUDGEMENTDAY 13

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {

int i=0;

int **chair_assg;
// int chair_assg[JUDGEMENTDAY+1][SIZE];
//int chair_assg[JUDGEMENTDAY][SIZE];
int t=0,k,kk,j,jj,mid,did;
double cost;

///*
i = JUDGEMENTDAY + 1;
printf("i: %d",i);
//return;
chair_assg = calloc(i,sizeof(int*));
if(chair_assg == NULL)
return;
//chair_assg = calloc((JUDGEMENTDAY),sizeof(int*));
for(i=0;i<SIZE;i++) {
chair_assg[i] = calloc(SIZE,sizeof(int));
}

for(k=0;k<JUDGEMENTDAY;k++) {
printf("k: %d", k);
for(i=0;i<SIZE;i++) {
chair_assg[k][i] = 0;
}
if (k==11) // <-------------- HERE
return;
}
return 0;
}


 
Reply With Quote
 
 
 
 
Richard Tobin
Guest
Posts: n/a
 
      11-29-2007
In article <fimu5g$h0t$(E-Mail Removed)>, a <(E-Mail Removed)> wrote:
>I just don't know why for the following small program, I try different
>JUDGEMENTDAY from 1,2,... and when it is >= 13, segmentation fault appears
>if I don't force the program to exit by setting k to <= 11 in the last but 4
>line. I guess the program is accessing something invalid but just don't know
>why this happens.


Here's your program with the commented-out bits removed, and indented
for readability:

#define SIZE 12
#define JUDGEMENTDAY 13

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
int i=0;
int **chair_assg;
int t=0,k,kk,j,jj,mid,did;
double cost;

i = JUDGEMENTDAY + 1;
printf("i: %d",i);

chair_assg = calloc(i,sizeof(int*));
if(chair_assg == NULL)
return;

for(i=0;i<SIZE;i++) {
chair_assg[i] = calloc(SIZE,sizeof(int));
}

for(k=0;k<JUDGEMENTDAY;k++) {
printf("k: %d", k);
for(i=0;i<SIZE;i++) {
chair_assg[k][i] = 0;
}
}

return 0;
}

You seem to be confused about which dimension is SIZE and which is
JUDGEMENTDAY.

You use JUDGEMENTDAY+1 (=14) for the first dimension (rows) when
calloc()ing it (what was the +1 for?). Then you count up to SIZE (12)
when assigning calloc()ed space for each row. So you have only
allocated space for 12 of the 14 rows.

The you assign 0 to SIZE (12) columns in each of JUDGEMENTDAY (13)
rows - but only 12 of those rows have been allocated.

-- Richard
--
"Consideration shall be given to the need for as many as 32 characters
in some alphabets" - X3.4, 1963.
 
Reply With Quote
 
 
 
 
Marco Manfredini
Guest
Posts: n/a
 
      11-29-2007
a wrote:

> i = JUDGEMENTDAY + 1;
> chair_assg = calloc(i,sizeof(int*));


chair_assg has JUDGEMENTDAY+1 elements..

> for(i=0;i<SIZE;i++) {
> chair_assg[i] = calloc(SIZE,sizeof(int));


Here's the error: you assign the elements 0-(SIZE-1), but "SIZE" has
nothing to do with the number of elements in chair_assign. Actually the
for statements should be

for(i=0;i<JUDGEMENTDAY+1;i++) // The +1 is from your code.
{
chair_assg[i] = calloc(SIZE,sizeof(int));
if (chair_assg[i]==0) return 1;
}

You mixed up the array dimensions.

> for(k=0;k<JUDGEMENTDAY;k++) {
> printf("k: %d", k);
> for(i=0;i<SIZE;i++) {
> chair_assg[k][i] = 0;
> }
> if (k==11) // <-------------- HERE

This breaks for k==12 here, because chair_assg[12] has never been
assigned.

--
IYesNo yes=YesNoFactory.getFactoryInstance().YES;
yes.getDescription().equals(array[0].toUpperCase());
 
Reply With Quote
 
Dik T. Winter
Guest
Posts: n/a
 
      11-29-2007
In article <fimu5g$h0t$(E-Mail Removed)> "a" <(E-Mail Removed)> writes:
> I just don't know why for the following small program, I try different
> JUDGEMENTDAY from 1,2,... and when it is >= 13, segmentation fault appears
> if I don't force the program to exit by setting k to <= 11 in the last but 4
> line. I guess the program is accessing something invalid but just don't know
> why this happens.
>
> #define SIZE 12
> #define JUDGEMENTDAY 13

....
> for(i=0;i<SIZE;i++) {
> chair_assg[i] = calloc(SIZE,sizeof(int));


Read this piece of code, there is the error.
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/
 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      12-02-2007
On Fri, 30 Nov 2007 01:50:38 +0800, "a" <(E-Mail Removed)> wrote:

>By James Kuyper insightful suggestion, I identified my program error sources
>from calloc.
>
>I just don't know why for the following small program, I try different
>JUDGEMENTDAY from 1,2,... and when it is >= 13, segmentation fault appears
>if I don't force the program to exit by setting k to <= 11 in the last but 4
>line. I guess the program is accessing something invalid but just don't know
>why this happens.
>
>#define SIZE 12
>#define JUDGEMENTDAY 13
>
>#include <stdlib.h>
>#include <stdio.h>
>int main(int argc, char **argv) {
>
> int i=0;
>
> int **chair_assg;
>// int chair_assg[JUDGEMENTDAY+1][SIZE];
> //int chair_assg[JUDGEMENTDAY][SIZE];
> int t=0,k,kk,j,jj,mid,did;
> double cost;
>
> ///*
> i = JUDGEMENTDAY + 1;
> printf("i: %d",i);
> //return;
> chair_assg = calloc(i,sizeof(int*));
> if(chair_assg == NULL)
> return;


Didn't your compiler generate a diagnostic because you are returning
from main but not returning an int as promised by the declaration?

> //chair_assg = calloc((JUDGEMENTDAY),sizeof(int*));
> for(i=0;i<SIZE;i++) {
> chair_assg[i] = calloc(SIZE,sizeof(int));


Funny that you don't feel the need to check the return from calloc as
you did above.

> }
>
> for(k=0;k<JUDGEMENTDAY;k++) {
> printf("k: %d", k);


This should print k: 0k: 1k: 2. Unless your terminal uses paper,
adding a \n to your format string does not cost any more money.

> for(i=0;i<SIZE;i++) {
> chair_assg[k][i] = 0;


Why are you doing this since the space was already zeroed out by
calloc?

> }
> if (k==11) // <-------------- HERE


Others have explained how your inconsistent indices have resulted in
attempting to dereference a pointer whose value is all bits zero
(possibly a NULL pointer).

> return;
> }
> return 0;
> }
>



Remove del for email
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
calloc.... Why? JKop C++ 14 07-20-2004 01:38 PM
malloc/calloc free with double pointers luca C++ 5 03-02-2004 06:01 PM
Re: string calloc segmentation fault -- help! Kevin Goodsell C++ 0 09-02-2003 09:44 PM
Re: string calloc segmentation fault -- help! Andrey Tarasevich C++ 0 09-02-2003 07:03 PM
Re: Override malloc,calloc,realloc and free? Jun Woong C Programming 0 06-26-2003 03:49 PM



Advertisments