|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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; } |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
In article <fimu5g$h0t$1@justice.itsc.cuhk.edu.hk>, a <a@a.com> 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. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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()); |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
In article <fimu5g$h0t$1@justice.itsc.cuhk.edu.hk> "a" <a@a.com> 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/ |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On Fri, 30 Nov 2007 01:50:38 +0800, "a" <a@a.com> 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 |
|
![]() |
| Outils de la discussion | |
|
|