I thought str1 is the destination and will be modified, i.e. appended with str2. And using two const char * I got warnings as:
Code:
prog009c2.c:73:2: warning: passing argument 1 of ‘strmerg' discards ‘const' qualifier from pointer target type [enabled by default]
prog009c2.c:21:7: note: expected ‘char *' but argument is of type ‘const char *'
Is it? I didn't think it changed, but that may be my mistake. In any case, you have to think about the code I give you, not blindly use it -- especially not make blind changes just to "fix compiler errors". Can you tell me why I said to make these variables const? And how I told you to deal with those warnings?
As for question 2 -- you're back at square one with pointers again. What, exactly, have you assumed that str3 = ... is going to do?
Last edited by Corona688; 04-02-2014 at 02:44 PM..
My understanding of "why they are const" is to avoid modification of the parameters by accident. For my strmerg( char *dest, char *src) function, the original design is dest and src are inter-changable, i.e. src can be appended to dest and vice verse.
I did not know the const char * restriction at the beginning to avoid editing the parameters.
True, at this moment I am trying to cross the stage to "make blind changes ...to fix the compiler error". When you ask me "why I said make these variables const" I thought I understood your saying, but not really. ------Should I give up with C now? Thank you!
I am dumping raw memory contents to show you what happens when you declare a variable on the stack, and allocate memory with malloc.
For the purposes of this, you can ignore the contents of the 'printpage' and 'spew' functions, they're convenience functions I made to dump memory and are not related otherwise.
Remember that memory can be considered to be one gigantic array of bytes, from address 00000000 all the way up to ffffffff (on a 32-bit machine). Pointers are just array indexes inside this array.
So we allocate four blocks of 16 bytes, set their first element to something, and dump memory to see where they ended up:
...but what about mem1 itself? Something, somewhere, has to remember that address of 0x85ef008, yes? And it does, on the "stack", which is a big block of memory which the processor uses as temporary space.
There's actually quite a lot of stuff on the stack. It's not just us that's using it. Every time you call a function, it uses stack to pass arguments, create local variables, and remember where to return. It gets used so much, in fact, that you can't trust that a local variable doesn't contain previously-used garbage values unless you set it to anything else yourself.
It's there all right. Slightly out-of-order, but it's there. That's the order an x86 processor handles all numbers, nothing weird. Humans are weird in wanting it highest-to-lowest digit order instead of something easily mechanically processable, which is why we have printf to handle that job for us.
Now, we want to put a different string into mem1. What will the statement 'mem1=mem3' do?
If mem1 is a pointer to a string, mem1=... does not modify the string. It alters the pointer.
Moderator's Comments:
pointer = cannot, will not, absolutely not, at all, ever, even for the sake of argument ever do anything else except alter the pointer.
Also: free() requires the exact same pointer that malloc() gave you. If you give it a different pointer, even slightly, it will crash.
If you give it the same pointer twice, it will crash. (Which means, if we did free() on all our pointers, our program would crash right now.)
If you write beyond the end of the memory you allocated, it will probably crash. (Because, as you can see in the dump, if you write beyond that you're stomping on top of something else).
Last edited by Corona688; 04-02-2014 at 04:15 PM..
These 3 Users Gave Thanks to Corona688 For This Post:
We've had this conversation four or five times. You have a hard time telling when you are modifying the pointer instead of its contents. But the compiler can tell you that easily, so I have a suggestion:
Whenever you do char *mem=malloc(300); ...do this instead: char * const mem=malloc(300); This will make the mistake you keep repeating a compiler error -- "assignment of read-only variable". (It of course sets it, once, when you declare it. But thereafter it's considered 'fixed'.)
You are still free to modify its contents, like with strcpy(mem, originalstring) or mem[5]='Q' or *(mem+5)=37 or any other way you please. But if you try to alter the pointer that's an error. You can understand "assignment of read-only value" to mean "whoops, I mixed up a pointer's value and its contents".
If you find yourself needing to do complicated circumlocutions to get around 'assignment of read only variable', you can be fairly sure you've taken a wrong turn somewhere.
Last edited by Corona688; 04-02-2014 at 04:34 PM..
These 2 Users Gave Thanks to Corona688 For This Post:
I have a bi-lingual database of a large number of dictionaries. It so happens that in some a given string is in upper case and in others it is in lower case. An example will illustrate the issue.
toll Tax=पथ-कर
Toll tax=राहदारी कर
toll tax=टोल
I want to treat all three instances of toll tax... (3 Replies)
I am preparing a morphological grammar of Marathi to be placed in open-source.
I have two files.
The first file called Adverbs contains a whole list of words, one word per line
A sample is given below:
आधी
इतक
इतपत
उलट
एवढ
ऐवजी
कड
कडनं
कडल
कडील
कडून
कडे
करता
करिता
खाल (2 Replies)
Perl script to merge cells
---------- Post updated at 12:59 AM ---------- Previous update was at 12:54 AM ----------
I am using below code to read files from a dir and print to excel.
open(my $in, '<', $file) or die "Could not open file: $!";
my $rowCount = 0;
my $colCount = 0;... (11 Replies)
Hello,
I am working on an Urdu to Hindi dictionary which has the following structure:
a=b
a=c
n=d
n=q
and so on.
i.e. Headword separated from gloss by a =
I am giving below a live sample
بتا=बता
بتا=बित्ता
بتا=बुत्ता
بتان=बतान
بتان=बितान
بتانا=बिताना
I need the following... (3 Replies)
Dears my rootvg is missed up i can not extend the /opt
as soon as i try to extend the Filesystem its give me that there is not enough space .
as there any way to change the REGION of the LVs in HDISK1 ?
lspv -p hdisk0
hdisk0:
PP RANGE STATE REGION LV NAME TYPE ... (8 Replies)
Hi,
I would like to know how can I get the ID of a feature if its genomic coordinates overlap the coordinates of another file. Example:
Get the 4th column (ID) of this file1:
chr1 10 100 gene1
chr2 3000 5000 gene2
chr3 200 1500 gene3
if it overlaps with a feature in this file2:
chr2... (1 Reply)
How can I find the regions between specific lines?
I have a file which contains lines like this:
chr1 0 17388 0
chr1 17388 17444 1
chr1 17444 17599 2
chr1 17599 17601 1
chr1 17601 569791 0
chr1 569791 569795 1
chr1 569795 569808 2
chr1 569808 569890 3
chr1 569890 570047 4 ... (9 Replies)
Hello all,
I have a question about what you think the best practice is to determine what region you are running on when you have a system setup with a DEV/TEST, QA, and PROD regions running the same scripts in all.
So, when you run in DEV, you have a different directory structure, and you... (4 Replies)
str1="this oracle data base record"
str2="one two three four five"
Output:
this one
oracle two
data three
base four
record five
str1 and str2 have the same column but they are not fixed columns.
I can do it with "paste" but I do not want to create file everytime the
script runs from... (2 Replies)