Pointer and address


 
Thread Tools Search this Thread
Top Forums Programming Pointer and address
# 8  
Old 05-07-2013
Here's how I would put it. Much of this you probably already know.

If you declare int n = 4;, then the compiler reserves a special location to store an int value, and stores 4 there. No big deal. The location for n is an address, some big number the program uses to keep track of where that n variable is located. We cannot change the address of n, so that's an important point. And we normally don't need to know the value of the address. The address value for n might change each time the program runs.

If you declare int *n_ptr = &n;, then the compiler reserves a special location to store a pointer value, and stores the address of n there. n and n_ptr are both variables. Again, n_ptr has an address, some big number used to keep track of where it is. Again, we cannot change the address of n_ptr. Of course, *n_ptr is the contents of the n var, so 4 in this case.

The difference between n and n_ptr is that the program "knows" (because it reads the declaration) that n holds an int, and that n_ptr holds the address of an int variable.

Another difference is that n++ results in adding one (like 4 -> 5), but n_ptr++ results in adding something like four or eight (like 1000000 -> 1000004) to move the address to the next slot that can hold an int. If the size of an int is four bytes, then n_ptr++ increases n_ptr by 4 (not 1).

&n and &n_ptr both make sense. You can take an address of either variable. You could do int **n_pp = &n_ptr;

But only *n_ptr makes sense (would equal 4). *n makes no sense, does not compile, because the n variable does not point to anything else. You can only dereference (with *) a pointer variable, or an array.

Inside the running program, a pointer (like char *ptr_var; and array (like char array_var[10];) are treated the same in many ways, but are different things.

Some similarities: &ptr_var and &array_var both work and produce the same result. *ptr_var, *array_var, ptr_var[0], array_var[0] all work and produce the same result.

A difference: ptr_var++ works, and increases the stored value. But array_var++ does not work, because it will try to increase the address of array_var and this does not make sense, is not allowed. Just like we cannot change the address of the n variable, we cannot change the address of the array_var. You could say array_var[0]++ and that's OK.

--------------------------------

Quote:
Can I say the address of a pointer is an array of char there in these two cases (strings!)? In the second sample *arr was printed out by looping thru the actual char array, but argv[iCount] was not looped thru, where *argv[iCount] was only the first char of its contents. Is this correct?
I would say the pointer has an address and also holds an address.

I would say argv was looped through in both cases, but just a different way, either by increasing iCount or by increasing the address held in the argv variable.

Yes, *argv[iCount] is only the first char of the contents, and is exactly the same as argv[iCount][0]

----------------------------

This stuff is confusing for many or most C programmers. But it's very interesting and really important for effective programming. As you are doing, one good way to learn is to write little test programs, and see what happens.
This User Gave Thanks to hanson44 For This Post:
# 9  
Old 05-08-2013
pointer and address

Thanks a lot Hanson!
I am always told "without pointer you cannot get C"! I need more reading and digestion. With your help, and those from the forum, I feel optimistic to catch it. Thank you very much again!
Yifangt
# 10  
Old 05-08-2013
Better "The address in pointer argv points to memory containing an array of pointers, each pointing to memory containing a character array, except the last (highest) pointer in the array is null." The argv pointer is stored on the call stack as a parameter, first bit of memory, points to the array of pointers, second bit of memory, and if there are, say, 5 pointers in the array, 4 point to additional areas of memory with null terminated character arrays, and the 5th, highest is set to zeros (null). For instance, &argv might be 0xFFFFE078, containing a heap address 0x00031244, and the array of pointers is in 0x00031244-57 inclusive. The first pointer in 0x00031244-7 might be 0x00030711. The first character array may occupy 0x00030711-5, loaded with "haha", 4 char and a null.
# 11  
Old 05-08-2013
To the OP:
If what follows confuses the issue, please ignore it. It's not critical to what you are dealing with at the moment.


Quote:
Originally Posted by DGPickett
The address in pointer argv points to memory containing an array of pointers, each pointing to memory containing a character array, except the last (highest) pointer in the array is null." ... The argv pointer is stored on the call stack as a parameter, first bit of memory, points to the array of pointers, second bit of memory, and if there are, say, 5 pointers in the array, 4 point to additional areas of memory with null terminated character arrays, and the 5th, highest is set to zeros (null). For instance, &argv might be 0xFFFFE078, containing a heap address 0x00031244, and the array of pointers is in 0x00031244-57 inclusive. The first pointer in 0x00031244-7 might be 0x00030711. The first character array may occupy 0x00030711-5, loaded with "haha", 4 char and a null.
If you'll pardon a few nits ...

The null pointer is not required to be all zeroes. Its representation is implementation defined. Further, null pointers to different types are allowed to have different internal represenations (even though a zero in source code in a pointer context is always converted to the correct internal representation for a null pointer of that type).

You mention argv pointing to the heap. You did not state that this is invariably the case, nor is it my intention to imply that you did. However, I wanted to mention that main's arguments and the environment can be found above the stack (at least on Linux and *BSD x86/amd64). On all of my systems, heap < stack < argv.

A typical result from a 32-bit x86 Linux system:
Code:
heap: 0x804a000
stack: 0xbf9023ac
argv: 0xbf9023d4

I would be genuinely interested in knowing if some of the proprietary unices (Solaris, HP-UX, AIX, etc) do things differently, but such posts would muddle the OP's thread. If you (or anyone else) are interested, please visit https://www.unix.com/unix-advanced-ex...thou-argv.html

Regards,
Alister
# 12  
Old 05-08-2013
Some would argue the heap is only things malloc()'d/new, and the other stuff is code pages, constants pages, preloaded initialized variables.

I have noticed environment at the end of core dumps, so exec() may use copy it to automatic storage before calling main. It'd be interesting to see if what you pass exec as environment can affect the core image.

Generally, executable stuff and control structures are at the bottom. The OS may want constants in separate pages marked read only, code in pages marked read/execute no write and of course the modifiable heap in read write no execute pages. The stack is growing down from the top, and the heap up from the bottom, and an mmap() may take out a hunk of address space.

Of course, with 64 bit CPUs, the addresses double in size, increasing reach and slowing execution. It's about time for someone to make a CPU with variable length addresses, like utf-8. Past CPUs have had variable length addressing to speed smaller bits of code needing only short relative reach.
# 13  
Old 05-08-2013
Quote:
Originally Posted by DGPickett
Some would argue the heap is only things malloc()'d/new ...
I would consider that to be a weak argument, even though it has historical appeal. Once upon a time, the limits of malloc'd memory coincided with sbrk(0). This is no longer necessarily the case.

Several modern malloc implementations utilize mmap, meaning that the allocated memory is no longer contiguous. It does not make much sense to refer to malloc'd memory as a heap if it is fragmented.

glibc malloc uses sbrk for allocations less than MMAP_THRESHOLD and mmap for allocations greater than or equal to that value (iirc, MMAP_THRESHOLD is usually set at 1 megabyte). FreeBSD and NetBSD mallocs use mmap but can be configured to use sbrk. OpenBSD malloc uses mmap exclusively (in part because memory mismanagement of non-contiguous regions is more likely to trigger a segfault and expose bugs, and has done so in the past).

I have no knowledge of proprietary UNIX mallocs, but I welcome any information on that front.

To me, the heap ends with sbrk(0).

Forgive me if I seem to be quibbling over semantics, because that is not my intention. Nor is it my intention to win an "Internet argument" that is ultimately of little importance. I simply consider this to be an interesting and relevant topic on which many people are misinformed (I am not suggesting that you are one of them).

Regards,
Alister
# 14  
Old 05-08-2013
pointer and its address

Now the discussion is way beyond my current comprehension, but it is what I am expecting to understand. I am lost! Thank you guys!
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

C program to detect duplicate ip address if any after assigning ip address to ethernet interface

Hi , Could someone let me know how to detect duplicate ip address after assigning ip address to ethernet interface using c program (3 Replies)
Discussion started by: Gopi Krishna P
3 Replies

2. UNIX for Dummies Questions & Answers

Printing pointer address

How can I print the memory address of a pointer using printf (or any other STDOUT functions?). I see in Linux its %p but not in unix, help? thanks (5 Replies)
Discussion started by: perleo
5 Replies

3. IP Networking

Tracing a MAC address to IP address: Solaris

Hi there I lost connectivity to one of our remote systems and when I checked the messages log I found the following: Aug 10 23:42:34 host xntpd: time reset (step) 1.681729 s Aug 16 13:20:51 host ip: WARNING: node "mac address" is using our IP address x.x.x.x on aggr1 Aug 16 13:20:51 host... (9 Replies)
Discussion started by: notreallyhere
9 Replies

4. UNIX for Dummies Questions & Answers

Panic kernal-mode address fault on user address 0x14

:) Firstly Hi all!!, im NEW!! and on here hoping that someone might be able to offer me some help... i have a server that keeps crashing every few days with the error message: PANIC KERNAL-MODE ADDRESS FAULT ON USER ADDRESS 0X14 KERNAL PAGE FAULT FROM (CS:EIP)=(100:EF71B5BD) EAX=EF822000... (10 Replies)
Discussion started by: Twix
10 Replies

5. Shell Programming and Scripting

ksh - how to list all ip address between 2 ip address

Trying to do a ksh script that needs to list all ip address between ip address a and b .. ie. Ip address A=192.168.1.200 Ip address B=192.168.2.15 So the subnet changes from 1 to 2 but I want to list all possible ip addresses between the 2.. Which would be: 192.168.1.200... (4 Replies)
Discussion started by: frustrated1
4 Replies

6. Programming

pass a pointer-to-pointer, or return a pointer?

If one wants to get a start address of a array or a string or a block of memory via a function, there are at least two methods to achieve it: (1) one is to pass a pointer-to-pointer parameter, like: int my_malloc(int size, char **pmem) { *pmem=(char *)malloc(size); if(*pmem==NULL)... (11 Replies)
Discussion started by: aaronwong
11 Replies

7. Programming

address of pointer

Hi i'm new to c programming and i'm trying to change the address of a pointer/variable but i can't seem to get it right, I have this char heap; char *firstFree = heap; char *allocMem( int size ) { void *malloc(size_t sizeofint); /*allocate space for an array with size... (19 Replies)
Discussion started by: Poison Ivy
19 Replies

8. Programming

A Pointer to non-Virtual Address, and All of my Hard drive

How do I get a pointer to any 32 bit address on my hard drive, in which I then could read that memory or write to that memory address? And, while the subject is on, how do get a 32 bit pointer in RAM also, in which I can do the same? I'm using C and Objective-C with gcc on an iBook G4. A... (9 Replies)
Discussion started by: xcoder66
9 Replies

9. IP Networking

How to Achive IP address through MAC(Ethernet) address

Hi sir, i want to make such programe which takes MAC(Ethernet) address of any host & give me its IP address....... but i'm nt getting that how i can pass the MAC address to Frame........ Please give me an idea for making such program... Thanks & regards Krishna (3 Replies)
Discussion started by: krishnacins
3 Replies

10. UNIX for Dummies Questions & Answers

network address and broadcast address?

say I have a IP address which is 10.0.0.12, and subnet mask is 255.255.255.240, what is the network address and what is the broadcast address which host lives on? And could you explain how to get the answer? thanx in advance! (7 Replies)
Discussion started by: pnxi
7 Replies
Login or Register to Ask a Question