Thread: [Dev-C++] Allocation problem
Open Source C & C++ IDE for Windows
Brought to you by:
claplace
|
From: Matthews <dem...@uw...> - 2003-09-19 20:23:37
|
I'm working on a program to generate makefiles for me, and I currently have
it set up to read different sections of a file to generate the options.
One section is %input, which has a list of filenames to include, eg.
prj.txt
%input
main.c
vid.c
gui.c
I read these into a struct organized like so:
struct prj_info
{
...
char **input;
...
}
And I allocate space based on how many files there are (an array of
strings, basically)
My problem is that I get errors when running the following C code:
if(!strncmp("%include",t,strlen(t)-1))
{
count = 0;
skip_line(buf);
getword(buf,t);
longest_length = strlen(t);
info.input = (char *)malloc((sizeof(char)*longest_len)*1);
if(!info.input)
{
printf("OH NOS\n");
return 0;
}
//CRASH HERE
strcpy(info.input[count],t);
while(*buf!='%')
{
while(*buf=='#'||isspace(*buf)) skip_line(buf);
getword(buf,t);
if(strlen(t)>longest_length) longest_length = strlen(t);
count++;
realloc(info.input,(sizeof(char)*longest_length)*count);
if(!info.input)
{
printf("ERR0RZ\n");
return 0;
}
strcpy(info.input[count],t);
skip_line(buf);
}
}
Buf is the dumped contents of a file (like prj.txt), getword() places a
word from buf into t and skip_line() skips to the next line in buf.
The code compiles fine, but crashes at the first strcpy(). Any help would
be appreciated.
|
|
From: Per W. <pw...@ia...> - 2003-09-20 09:33:24
|
When you allocate buffers for strings, you must allocate room for
strlen(str)+1
characters, or the termination character '\0' will not fit.
/Per W
On Fri, 19 Sep 2003, Matthews wrote:
> I'm working on a program to generate makefiles for me, and I currently have
> it set up to read different sections of a file to generate the options.
> One section is %input, which has a list of filenames to include, eg.
>
> prj.txt
>
> %input
> main.c
> vid.c
> gui.c
>
> I read these into a struct organized like so:
>
> struct prj_info
> {
> ...
> char **input;
> ...
> }
>
> And I allocate space based on how many files there are (an array of
> strings, basically)
>
> My problem is that I get errors when running the following C code:
>
> if(!strncmp("%include",t,strlen(t)-1))
> {
> count = 0;
> skip_line(buf);
> getword(buf,t);
> longest_length = strlen(t);
> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
> if(!info.input)
> {
> printf("OH NOS\n");
> return 0;
> }
> //CRASH HERE
> strcpy(info.input[count],t);
> while(*buf!='%')
> {
> while(*buf=='#'||isspace(*buf)) skip_line(buf);
> getword(buf,t);
> if(strlen(t)>longest_length) longest_length = strlen(t);
> count++;
> realloc(info.input,(sizeof(char)*longest_length)*count);
> if(!info.input)
> {
> printf("ERR0RZ\n");
> return 0;
> }
> strcpy(info.input[count],t);
> skip_line(buf);
> }
> }
>
> Buf is the dumped contents of a file (like prj.txt), getword() places a
> word from buf into t and skip_line() skips to the next line in buf.
>
> The code compiles fine, but crashes at the first strcpy(). Any help would
> be appreciated.
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Dev-cpp-users mailing list
> Dev...@li...
> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>
|
|
From: Matthews <dem...@uw...> - 2003-09-21 12:13:12
|
Still giving me the same crash :\
At 11:32 AM 20/09/2003 +0200, Per Westermark wrote:
>When you allocate buffers for strings, you must allocate room for
>strlen(str)+1
>characters, or the termination character '\0' will not fit.
>
>/Per W
>
>On Fri, 19 Sep 2003, Matthews wrote:
>
>> I'm working on a program to generate makefiles for me, and I currently have
>> it set up to read different sections of a file to generate the options.
>> One section is %input, which has a list of filenames to include, eg.
>>
>> prj.txt
>>
>> %input
>> main.c
>> vid.c
>> gui.c
>>
>> I read these into a struct organized like so:
>>
>> struct prj_info
>> {
>> ...
>> char **input;
>> ...
>> }
>>
>> And I allocate space based on how many files there are (an array of
>> strings, basically)
>>
>> My problem is that I get errors when running the following C code:
>>
>> if(!strncmp("%include",t,strlen(t)-1))
>> {
>> count = 0;
>> skip_line(buf);
>> getword(buf,t);
>> longest_length = strlen(t);
>> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
>> if(!info.input)
>> {
>> printf("OH NOS\n");
>> return 0;
>> }
>> //CRASH HERE
>> strcpy(info.input[count],t);
>> while(*buf!='%')
>> {
>> while(*buf=='#'||isspace(*buf)) skip_line(buf);
>> getword(buf,t);
>> if(strlen(t)>longest_length) longest_length = strlen(t);
>> count++;
>> realloc(info.input,(sizeof(char)*longest_length)*count);
>> if(!info.input)
>> {
>> printf("ERR0RZ\n");
>> return 0;
>> }
>> strcpy(info.input[count],t);
>> skip_line(buf);
>> }
>> }
>>
>> Buf is the dumped contents of a file (like prj.txt), getword() places a
>> word from buf into t and skip_line() skips to the next line in buf.
>>
>> The code compiles fine, but crashes at the first strcpy(). Any help would
>> be appreciated.
>>
>>
>> -------------------------------------------------------
>> This sf.net email is sponsored by:ThinkGeek
>> Welcome to geek heaven.
>> http://thinkgeek.com/sf
>> _______________________________________________
>> Dev-cpp-users mailing list
>> Dev...@li...
>> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
>> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>>
>
>
|
|
From: Reid T. <rei...@at...> - 2003-09-21 15:39:21
|
why is longest_len being cast to a char * in sizeof? and where is
longest_len defined/set?
>> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
Matthews wrote:
> Still giving me the same crash :\
>
> At 11:32 AM 20/09/2003 +0200, Per Westermark wrote:
> >When you allocate buffers for strings, you must allocate room for
> >strlen(str)+1
> >characters, or the termination character '\0' will not fit.
> >
> >/Per W
> >
> >On Fri, 19 Sep 2003, Matthews wrote:
> >
> >> I'm working on a program to generate makefiles for me, and I
> currently have
> >> it set up to read different sections of a file to generate the
> options.
> >> One section is %input, which has a list of filenames to include, eg.
> >>
> >> prj.txt
> >>
> >> %input
> >> main.c
> >> vid.c
> >> gui.c
> >>
> >> I read these into a struct organized like so:
> >>
> >> struct prj_info
> >> {
> >> ...
> >> char **input;
> >> ...
> >> }
> >>
> >> And I allocate space based on how many files there are (an array of
> >> strings, basically)
> >>
> >> My problem is that I get errors when running the following C code:
> >>
> >> if(!strncmp("%include",t,strlen(t)-1))
> >> {
> >> count = 0;
> >> skip_line(buf);
> >> getword(buf,t);
> >> longest_length = strlen(t);
> >> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
> >> if(!info.input)
> >> {
> >> printf("OH NOS\n");
> >> return 0;
> >> }
> >> //CRASH HERE
> >> strcpy(info.input[count],t);
> >> while(*buf!='%')
> >> {
> >> while(*buf=='#'||isspace(*buf)) skip_line(buf);
> >> getword(buf,t);
> >> if(strlen(t)>longest_length) longest_length = strlen(t);
> >> count++;
> >> realloc(info.input,(sizeof(char)*longest_length)*count);
> >> if(!info.input)
> >> {
> >> printf("ERR0RZ\n");
> >> return 0;
> >> }
> >> strcpy(info.input[count],t);
> >> skip_line(buf);
> >> }
> >> }
> >>
> >> Buf is the dumped contents of a file (like prj.txt), getword()
> places a
> >> word from buf into t and skip_line() skips to the next line in buf.
> >>
> >> The code compiles fine, but crashes at the first strcpy(). Any
> help would
> >> be appreciated.
> >>
> >>
> >> -------------------------------------------------------
> >> This sf.net email is sponsored by:ThinkGeek
> >> Welcome to geek heaven.
> >> http://thinkgeek.com/sf
> >> _______________________________________________
> >> Dev-cpp-users mailing list
> >> Dev...@li...
> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
> >>
> >
> >
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Dev-cpp-users mailing list
> Dev...@li...
> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>
|
|
From: Per W. <pw...@ia...> - 2003-09-21 21:20:44
|
prj_info.input is a pointer to a pointer to char.
If you want to store 10 lines in it:
info.input = (char**)malloc(10*sizeof(char*));
info.input[0] = (char*)malloc(sizeof(char)*(strlen("mystr1")+1));
...
info.input[9] = (char*)malloc(sizeof(char)*(strlen("mystr10")+1));
strcpy(info.input[0],"mystr1");
...
strcpy(info.input[9],"mystr10");
Question: Don't you ever try to get the compiler to generate as many
warnings as possible, and then check up on the warnings?
The compiler would definitely become a bit worried when you do:
info.input = (char*)malloc(...);
since you are typecasting to the wrong type.
Take two steps back and think a bit about your code and what you want to
do. Check up on all data types, and exactly what you allocate.
That little realloc() line you have is very, very interesting. You are
reallocating the wrong thing - did you intend to reallocate the array
of pointers to text strings, or a specific string buffer in the array?
- and you are forgetting that the new pointer is the RETURN VALUE of the
realloc() call.
/Per W
On Sat, 20 Sep 2003, Matthews wrote:
> Still giving me the same crash :\
>
> At 11:32 AM 20/09/2003 +0200, Per Westermark wrote:
> >When you allocate buffers for strings, you must allocate room for
> >strlen(str)+1
> >characters, or the termination character '\0' will not fit.
> >
> >/Per W
> >
> >On Fri, 19 Sep 2003, Matthews wrote:
> >
> >> I'm working on a program to generate makefiles for me, and I currently have
> >> it set up to read different sections of a file to generate the options.
> >> One section is %input, which has a list of filenames to include, eg.
> >>
> >> prj.txt
> >>
> >> %input
> >> main.c
> >> vid.c
> >> gui.c
> >>
> >> I read these into a struct organized like so:
> >>
> >> struct prj_info
> >> {
> >> ...
> >> char **input;
> >> ...
> >> }
> >>
> >> And I allocate space based on how many files there are (an array of
> >> strings, basically)
> >>
> >> My problem is that I get errors when running the following C code:
> >>
> >> if(!strncmp("%include",t,strlen(t)-1))
> >> {
> >> count = 0;
> >> skip_line(buf);
> >> getword(buf,t);
> >> longest_length = strlen(t);
> >> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
> >> if(!info.input)
> >> {
> >> printf("OH NOS\n");
> >> return 0;
> >> }
> >> //CRASH HERE
> >> strcpy(info.input[count],t);
> >> while(*buf!='%')
> >> {
> >> while(*buf=='#'||isspace(*buf)) skip_line(buf);
> >> getword(buf,t);
> >> if(strlen(t)>longest_length) longest_length = strlen(t);
> >> count++;
> >> realloc(info.input,(sizeof(char)*longest_length)*count);
> >> if(!info.input)
> >> {
> >> printf("ERR0RZ\n");
> >> return 0;
> >> }
> >> strcpy(info.input[count],t);
> >> skip_line(buf);
> >> }
> >> }
> >>
> >> Buf is the dumped contents of a file (like prj.txt), getword() places a
> >> word from buf into t and skip_line() skips to the next line in buf.
> >>
> >> The code compiles fine, but crashes at the first strcpy(). Any help would
> >> be appreciated.
> >>
> >>
> >> -------------------------------------------------------
> >> This sf.net email is sponsored by:ThinkGeek
> >> Welcome to geek heaven.
> >> http://thinkgeek.com/sf
> >> _______________________________________________
> >> Dev-cpp-users mailing list
> >> Dev...@li...
> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
> >>
> >
> >
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Dev-cpp-users mailing list
> Dev...@li...
> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>
|
|
From: Matthews <dem...@uw...> - 2003-09-24 22:22:58
|
Thanks a lot Per. It's working perfectly now. And the
> info.input = (char*)malloc(...);
was a mistype by me in the email, which is why I got no errors :p
At 11:19 PM 21/09/2003 +0200, Per Westermark wrote:
>prj_info.input is a pointer to a pointer to char.
>
>If you want to store 10 lines in it:
>
>info.input = (char**)malloc(10*sizeof(char*));
>info.input[0] = (char*)malloc(sizeof(char)*(strlen("mystr1")+1));
>...
>info.input[9] = (char*)malloc(sizeof(char)*(strlen("mystr10")+1));
>
>strcpy(info.input[0],"mystr1");
>...
>strcpy(info.input[9],"mystr10");
>
>Question: Don't you ever try to get the compiler to generate as many
>warnings as possible, and then check up on the warnings?
>
>The compiler would definitely become a bit worried when you do:
> info.input = (char*)malloc(...);
>since you are typecasting to the wrong type.
>
>Take two steps back and think a bit about your code and what you want to
>do. Check up on all data types, and exactly what you allocate.
>
>That little realloc() line you have is very, very interesting. You are
>reallocating the wrong thing - did you intend to reallocate the array
>of pointers to text strings, or a specific string buffer in the array?
>- and you are forgetting that the new pointer is the RETURN VALUE of the
>realloc() call.
>
>/Per W
>
>On Sat, 20 Sep 2003, Matthews wrote:
>
>> Still giving me the same crash :\
>>
>> At 11:32 AM 20/09/2003 +0200, Per Westermark wrote:
>> >When you allocate buffers for strings, you must allocate room for
>> >strlen(str)+1
>> >characters, or the termination character '\0' will not fit.
>> >
>> >/Per W
>> >
>> >On Fri, 19 Sep 2003, Matthews wrote:
>> >
>> >> I'm working on a program to generate makefiles for me, and I
currently have
>> >> it set up to read different sections of a file to generate the options.
>> >> One section is %input, which has a list of filenames to include, eg.
>> >>
>> >> prj.txt
>> >>
>> >> %input
>> >> main.c
>> >> vid.c
>> >> gui.c
>> >>
>> >> I read these into a struct organized like so:
>> >>
>> >> struct prj_info
>> >> {
>> >> ...
>> >> char **input;
>> >> ...
>> >> }
>> >>
>> >> And I allocate space based on how many files there are (an array of
>> >> strings, basically)
>> >>
>> >> My problem is that I get errors when running the following C code:
>> >>
>> >> if(!strncmp("%include",t,strlen(t)-1))
>> >> {
>> >> count = 0;
>> >> skip_line(buf);
>> >> getword(buf,t);
>> >> longest_length = strlen(t);
>> >> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
>> >> if(!info.input)
>> >> {
>> >> printf("OH NOS\n");
>> >> return 0;
>> >> }
>> >> //CRASH HERE
>> >> strcpy(info.input[count],t);
>> >> while(*buf!='%')
>> >> {
>> >> while(*buf=='#'||isspace(*buf)) skip_line(buf);
>> >> getword(buf,t);
>> >> if(strlen(t)>longest_length) longest_length = strlen(t);
>> >> count++;
>> >> realloc(info.input,(sizeof(char)*longest_length)*count);
>> >> if(!info.input)
>> >> {
>> >> printf("ERR0RZ\n");
>> >> return 0;
>> >> }
>> >> strcpy(info.input[count],t);
>> >> skip_line(buf);
>> >> }
>> >> }
>> >>
>> >> Buf is the dumped contents of a file (like prj.txt), getword() places a
>> >> word from buf into t and skip_line() skips to the next line in buf.
>> >>
>> >> The code compiles fine, but crashes at the first strcpy(). Any help
would
>> >> be appreciated.
>> >>
>> >>
>> >> -------------------------------------------------------
>> >> This sf.net email is sponsored by:ThinkGeek
>> >> Welcome to geek heaven.
>> >> http://thinkgeek.com/sf
>> >> _______________________________________________
>> >> Dev-cpp-users mailing list
>> >> Dev...@li...
>> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
>> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>> >>
>> >
>> >
>>
>>
>> -------------------------------------------------------
>> This sf.net email is sponsored by:ThinkGeek
>> Welcome to geek heaven.
>> http://thinkgeek.com/sf
>> _______________________________________________
>> Dev-cpp-users mailing list
>> Dev...@li...
>> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
>> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>>
>
>
|
|
From: Per W. <pw...@ia...> - 2003-09-25 06:53:03
|
Nice to ear.
One thing. Since source code is so very unforgiving about even the
smallest spelling errors it is always a good idea to cut and paste any
source code in the mails.
/Per W
On Wed, 24 Sep 2003, Matthews wrote:
> Thanks a lot Per. It's working perfectly now. And the
> > info.input = (char*)malloc(...);
> was a mistype by me in the email, which is why I got no errors :p
>
> At 11:19 PM 21/09/2003 +0200, Per Westermark wrote:
> >prj_info.input is a pointer to a pointer to char.
> >
> >If you want to store 10 lines in it:
> >
> >info.input = (char**)malloc(10*sizeof(char*));
> >info.input[0] = (char*)malloc(sizeof(char)*(strlen("mystr1")+1));
> >...
> >info.input[9] = (char*)malloc(sizeof(char)*(strlen("mystr10")+1));
> >
> >strcpy(info.input[0],"mystr1");
> >...
> >strcpy(info.input[9],"mystr10");
> >
> >Question: Don't you ever try to get the compiler to generate as many
> >warnings as possible, and then check up on the warnings?
> >
> >The compiler would definitely become a bit worried when you do:
> > info.input = (char*)malloc(...);
> >since you are typecasting to the wrong type.
> >
> >Take two steps back and think a bit about your code and what you want to
> >do. Check up on all data types, and exactly what you allocate.
> >
> >That little realloc() line you have is very, very interesting. You are
> >reallocating the wrong thing - did you intend to reallocate the array
> >of pointers to text strings, or a specific string buffer in the array?
> >- and you are forgetting that the new pointer is the RETURN VALUE of the
> >realloc() call.
> >
> >/Per W
> >
> >On Sat, 20 Sep 2003, Matthews wrote:
> >
> >> Still giving me the same crash :\
> >>
> >> At 11:32 AM 20/09/2003 +0200, Per Westermark wrote:
> >> >When you allocate buffers for strings, you must allocate room for
> >> >strlen(str)+1
> >> >characters, or the termination character '\0' will not fit.
> >> >
> >> >/Per W
> >> >
> >> >On Fri, 19 Sep 2003, Matthews wrote:
> >> >
> >> >> I'm working on a program to generate makefiles for me, and I
> currently have
> >> >> it set up to read different sections of a file to generate the options.
> >> >> One section is %input, which has a list of filenames to include, eg.
> >> >>
> >> >> prj.txt
> >> >>
> >> >> %input
> >> >> main.c
> >> >> vid.c
> >> >> gui.c
> >> >>
> >> >> I read these into a struct organized like so:
> >> >>
> >> >> struct prj_info
> >> >> {
> >> >> ...
> >> >> char **input;
> >> >> ...
> >> >> }
> >> >>
> >> >> And I allocate space based on how many files there are (an array of
> >> >> strings, basically)
> >> >>
> >> >> My problem is that I get errors when running the following C code:
> >> >>
> >> >> if(!strncmp("%include",t,strlen(t)-1))
> >> >> {
> >> >> count = 0;
> >> >> skip_line(buf);
> >> >> getword(buf,t);
> >> >> longest_length = strlen(t);
> >> >> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
> >> >> if(!info.input)
> >> >> {
> >> >> printf("OH NOS\n");
> >> >> return 0;
> >> >> }
> >> >> //CRASH HERE
> >> >> strcpy(info.input[count],t);
> >> >> while(*buf!='%')
> >> >> {
> >> >> while(*buf=='#'||isspace(*buf)) skip_line(buf);
> >> >> getword(buf,t);
> >> >> if(strlen(t)>longest_length) longest_length = strlen(t);
> >> >> count++;
> >> >> realloc(info.input,(sizeof(char)*longest_length)*count);
> >> >> if(!info.input)
> >> >> {
> >> >> printf("ERR0RZ\n");
> >> >> return 0;
> >> >> }
> >> >> strcpy(info.input[count],t);
> >> >> skip_line(buf);
> >> >> }
> >> >> }
> >> >>
> >> >> Buf is the dumped contents of a file (like prj.txt), getword() places a
> >> >> word from buf into t and skip_line() skips to the next line in buf.
> >> >>
> >> >> The code compiles fine, but crashes at the first strcpy(). Any help
> would
> >> >> be appreciated.
> >> >>
> >> >>
> >> >> -------------------------------------------------------
> >> >> This sf.net email is sponsored by:ThinkGeek
> >> >> Welcome to geek heaven.
> >> >> http://thinkgeek.com/sf
> >> >> _______________________________________________
> >> >> Dev-cpp-users mailing list
> >> >> Dev...@li...
> >> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> >> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
> >> >>
> >> >
> >> >
> >>
> >>
> >> -------------------------------------------------------
> >> This sf.net email is sponsored by:ThinkGeek
> >> Welcome to geek heaven.
> >> http://thinkgeek.com/sf
> >> _______________________________________________
> >> Dev-cpp-users mailing list
> >> Dev...@li...
> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
> >>
> >
> >
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Dev-cpp-users mailing list
> Dev...@li...
> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>
|
|
From: Matthews <dem...@uw...> - 2003-09-26 11:53:14
|
I would do that, but currently my email is accessible only through a
computer with no working disk drive/cd drive, etc. My coding is on another
computer, therefore you see the problem :D This should be fixed soon,
though, as I'm going to be getting a new computer within the next few days.
At 08:51 AM 25/09/2003 +0200, Per Westermark wrote:
>Nice to ear.
>
>One thing. Since source code is so very unforgiving about even the
>smallest spelling errors it is always a good idea to cut and paste any
>source code in the mails.
>
>/Per W
>
>On Wed, 24 Sep 2003, Matthews wrote:
>
>> Thanks a lot Per. It's working perfectly now. And the
>> > info.input = (char*)malloc(...);
>> was a mistype by me in the email, which is why I got no errors :p
>>
>> At 11:19 PM 21/09/2003 +0200, Per Westermark wrote:
>> >prj_info.input is a pointer to a pointer to char.
>> >
>> >If you want to store 10 lines in it:
>> >
>> >info.input = (char**)malloc(10*sizeof(char*));
>> >info.input[0] = (char*)malloc(sizeof(char)*(strlen("mystr1")+1));
>> >...
>> >info.input[9] = (char*)malloc(sizeof(char)*(strlen("mystr10")+1));
>> >
>> >strcpy(info.input[0],"mystr1");
>> >...
>> >strcpy(info.input[9],"mystr10");
>> >
>> >Question: Don't you ever try to get the compiler to generate as many
>> >warnings as possible, and then check up on the warnings?
>> >
>> >The compiler would definitely become a bit worried when you do:
>> > info.input = (char*)malloc(...);
>> >since you are typecasting to the wrong type.
>> >
>> >Take two steps back and think a bit about your code and what you want to
>> >do. Check up on all data types, and exactly what you allocate.
>> >
>> >That little realloc() line you have is very, very interesting. You are
>> >reallocating the wrong thing - did you intend to reallocate the array
>> >of pointers to text strings, or a specific string buffer in the array?
>> >- and you are forgetting that the new pointer is the RETURN VALUE of the
>> >realloc() call.
>> >
>> >/Per W
>> >
>> >On Sat, 20 Sep 2003, Matthews wrote:
>> >
>> >> Still giving me the same crash :\
>> >>
>> >> At 11:32 AM 20/09/2003 +0200, Per Westermark wrote:
>> >> >When you allocate buffers for strings, you must allocate room for
>> >> >strlen(str)+1
>> >> >characters, or the termination character '\0' will not fit.
>> >> >
>> >> >/Per W
>> >> >
>> >> >On Fri, 19 Sep 2003, Matthews wrote:
>> >> >
>> >> >> I'm working on a program to generate makefiles for me, and I
>> currently have
>> >> >> it set up to read different sections of a file to generate the
options.
>> >> >> One section is %input, which has a list of filenames to include, eg.
>> >> >>
>> >> >> prj.txt
>> >> >>
>> >> >> %input
>> >> >> main.c
>> >> >> vid.c
>> >> >> gui.c
>> >> >>
>> >> >> I read these into a struct organized like so:
>> >> >>
>> >> >> struct prj_info
>> >> >> {
>> >> >> ...
>> >> >> char **input;
>> >> >> ...
>> >> >> }
>> >> >>
>> >> >> And I allocate space based on how many files there are (an array of
>> >> >> strings, basically)
>> >> >>
>> >> >> My problem is that I get errors when running the following C code:
>> >> >>
>> >> >> if(!strncmp("%include",t,strlen(t)-1))
>> >> >> {
>> >> >> count = 0;
>> >> >> skip_line(buf);
>> >> >> getword(buf,t);
>> >> >> longest_length = strlen(t);
>> >> >> info.input = (char *)malloc((sizeof(char)*longest_len)*1);
>> >> >> if(!info.input)
>> >> >> {
>> >> >> printf("OH NOS\n");
>> >> >> return 0;
>> >> >> }
>> >> >> //CRASH HERE
>> >> >> strcpy(info.input[count],t);
>> >> >> while(*buf!='%')
>> >> >> {
>> >> >> while(*buf=='#'||isspace(*buf)) skip_line(buf);
>> >> >> getword(buf,t);
>> >> >> if(strlen(t)>longest_length) longest_length = strlen(t);
>> >> >> count++;
>> >> >> realloc(info.input,(sizeof(char)*longest_length)*count);
>> >> >> if(!info.input)
>> >> >> {
>> >> >> printf("ERR0RZ\n");
>> >> >> return 0;
>> >> >> }
>> >> >> strcpy(info.input[count],t);
>> >> >> skip_line(buf);
>> >> >> }
>> >> >> }
>> >> >>
>> >> >> Buf is the dumped contents of a file (like prj.txt), getword()
places a
>> >> >> word from buf into t and skip_line() skips to the next line in buf.
>> >> >>
>> >> >> The code compiles fine, but crashes at the first strcpy(). Any help
>> would
>> >> >> be appreciated.
>> >> >>
>> >> >>
>> >> >> -------------------------------------------------------
>> >> >> This sf.net email is sponsored by:ThinkGeek
>> >> >> Welcome to geek heaven.
>> >> >> http://thinkgeek.com/sf
>> >> >> _______________________________________________
>> >> >> Dev-cpp-users mailing list
>> >> >> Dev...@li...
>> >> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
>> >> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>> >> >>
>> >> >
>> >> >
>> >>
>> >>
>> >> -------------------------------------------------------
>> >> This sf.net email is sponsored by:ThinkGeek
>> >> Welcome to geek heaven.
>> >> http://thinkgeek.com/sf
>> >> _______________________________________________
>> >> Dev-cpp-users mailing list
>> >> Dev...@li...
>> >> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
>> >> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>> >>
>> >
>> >
>>
>>
>> -------------------------------------------------------
>> This sf.net email is sponsored by:ThinkGeek
>> Welcome to geek heaven.
>> http://thinkgeek.com/sf
>> _______________________________________________
>> Dev-cpp-users mailing list
>> Dev...@li...
>> TO UNSUBSCRIBE: http://www23.brinkster.com/noicys/devcpp/ub.htm
>> https://lists.sourceforge.net/lists/listinfo/dev-cpp-users
>>
>
|