Unclear pointer and array


 
Thread Tools Search this Thread
Top Forums Programming Unclear pointer and array
# 1  
Old 01-17-2014
Unclear pointer and array

Hello,
The purpose of the program is to print a sub string from the prompt inputs. I do not understand why char pointer does not work but char array will for line 40 and Line 41.
Code:
./a.out thisisatest 0 8
substring = "thisisat"

And my code is:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *substring(size_t start, size_t stop, const char *src, char *dst,
        size_t size)
{
    unsigned int count = stop - start;
    if (count >= --size) {
    count = size;
    }
    sprintf(dst, "%.*s", count, src + start);
    return dst;
}

int main(int argc, char **argv)
{

    char *text; //Line 40, change to text[100] will work
    char *a;    //Line 41, change to a[100] will work
    int start, end;

    if (argc != 4) {
    printf("Error! Usage:\n\t \
argv[0]=program;\n\t \
argv[1]=input string\n\t \
argv[2]=start_position of string\n\t \
argv[3]=end_postion of string\n");

    return 1;
    }

    strcpy(text, argv[1]);
    start = atoi(argv[2]);
    end = atoi(argv[3]);

    printf("substring = \"%s\"\n",
       substring(start, end, text, a, sizeof(a)));

    return 0;
}

Thanks a lot!

Last edited by yifangt; 01-17-2014 at 05:50 PM.. Reason: adding tags
# 2  
Old 01-18-2014
Hai yifangt

allocate memory like this, for your program

Code:
char *text=(char*)malloc(64);
char *a=(char*)malloc(64);

char a[7] = "HELLO";

Here String "Hello" is stored in Character Array 'a', where size is 7. here array 'a' stores characters in contiguous Memory Location. It will take following form after initialization.Each array location will get following values - and last 2 are unused.

Code:
| 0 | 1 | 2 | 3 | 4 |  5 | | |
|'H'|'E'|'L'|'L'|'O'|'\0'| | |

In this method element is accessed Sequentially

char *a = "HELLO";

String "Hello" will be stored at any Anonymous location in the form of array. We even don't know the location where we have stored string, However String will have its starting address.

here Address = [Base Address of Anonymous Array] + [i]

suppose you have to access a[3] then you need to get pointer value, add 3 to the pointer value, and gets the character pointed to by that value.

Code:
#include <stdio.h>

int main()
{
  char (*ptr)[7];
  char arr[7] = {'y','i','f','a','n','g','t'};
  int i;

  ptr = &arr;
  for(i=0; i<7; i++)
  {
    printf("Pointer value: %c Array value: %c\n", (*ptr)[i],arr[i]);
  }
}

Code:
$ ./a.out 
Pointer value: y Array value: y
Pointer value: i Array value: i
Pointer value: f Array value: f
Pointer value: a Array value: a
Pointer value: n Array value: n
Pointer value: g Array value: g
Pointer value: t Array value: t

This User Gave Thanks to Akshay Hegde For This Post:
# 3  
Old 01-18-2014
Thanks Akshay!
So the problem is, at Line 40 &41 of my code, the pointers (*text, *a) that were only declared but not allocated to memory, while the arrays text[100], and a[100] are allocated to memory automatically when they were declared. Is my understanding right? I do not have clear ideas on these points.
And, when I tried your suggestion:
Code:
char *text=(char*)malloc(64);
    char *a=(char*)malloc(64);

There is a bug that seems to be related to the memory allocation.
Code:
$ ./a.out thisisatest 0 6
substring = "thisis"
$./a.out thisisatest 0 7
substring = "thisisa"
$ ./a.out thisisatest 0 8
substring = "thisisa"
$ ./a.out thisisatest 0 9
substring = "thisisa"
$ ./a.out thisisatest 0 10
substring = "thisisa"

It seems to me *a only gets 7 byte plus '\0' at the end, total 8 bytes. Why not 64 bytes as allocated at Line 41?

Last edited by yifangt; 01-18-2014 at 08:18 AM..
# 4  
Old 01-18-2014
The declarations:
Code:
    char *text;
    char *a;

allocate space on the stack for two pointers to characters. And the size of a is the size of a pointer (4 bytes in a 32-bit application; 8 bytes in a 64-bit application).

With these declarations, the initial value of these pointers is whatever random bytes happen to have been on the stack. When you copy data or read data into an area pointed to by an uninitialized pointer, you will get a memory fault, a bus error, or overwrite data at some random location depending on what random bytes on the stack happen to underly your pointers. If you malloc() space for arrays of characters and assign the pointers that malloc() returned to your pointers, then you won't be overwriting a random location in memory, but you would still have a problem because the sizeof(a) in:
Code:
       substring(start, end, text, a, sizeof(a)));

is the size of the pointer; not the number of bytes allocated by malloc() to the array pointed to by a.

The declarations:
Code:
    char text[100];
    char a[100];

allocate two arrays of 100 bytes each on your stack. And the size of a is 100 bytes.
# 5  
Old 01-18-2014
Thanks Don!
Got your points about the array and pointer. But, when the substring is less than 8 char long, the output is correct, which seems the first 7 bytes are "not randomly overwritten". Why?
So it seems I have to use array in the original function (Line 40, Line 41). Then, what is the correct way if pointer is used? Thanks a lot again!

Last edited by yifangt; 01-18-2014 at 08:39 AM..
# 6  
Old 01-18-2014
I repeat:
Quote:
because the sizeof(a) in:
Code:
       substring(start, end, text, a, sizeof(a)));

is the size of the pointer; not the number of bytes allocated by malloc() to the array pointed to by a.
And, since you're getting 8 bytes for sizeof(a), we know that you are building your application as a 64-bit app; not as a 32-bit app. You don't want sizeof(a) when a is a pointer; you need to use the number of bytes allocated to the space pointed to by that pointer instead.
This User Gave Thanks to Don Cragun For This Post:
# 7  
Old 01-18-2014
Yes, got it!
Want to catch the pointer from the example. After I changed to:
Code:
substring(start, end, text, a, strlen(a)));

seems working, but need confirm if I did in the correct way.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Programming

Pointer for 2D array seems to be 3D in C

I am struggling with the pointer to 2D-array (cf: 2D array of pointers). Can anybody help me elaborate how the pointer x moves in the memory to access the individual of y, especially the high lighted lines? I have talked to one of the curators of the forum, but I am still not quite clear. Here... (1 Reply)
Discussion started by: yifangt
1 Replies

2. Programming

Character pointer to Character array

how to copy content of character pointer to character array in c programming.. char *num; char name=num; (1 Reply)
Discussion started by: zinat
1 Replies

3. Shell Programming and Scripting

best practises for scripting + a few unclear points

Hi guys, Besides the points bellow, what would best practices for scripting be ? 1) set the PATH 2) unset the current environment (set -u ?) 3) (re)set the IFS to default value - space (IFS="" <- is this correct ?) 4) check the return code for each action inside the script (cd, rsync,... (1 Reply)
Discussion started by: da1
1 Replies

4. Programming

structure pointer array as function parameters

if i create an array of pointers to a structure "struct node" as: struct node *r; and create "n" number of "linked lists" and assign it to the various struct pointers r using some function with a return type as structure pointer as: r=multiplty(.......) /*some parameters*/ is... (2 Replies)
Discussion started by: mscoder
2 Replies

5. Programming

help with char pointer array in C

i have an array like #define NUM 8 .... new_socket_fd = accept(socket_fd, (struct sockaddr *) &cli_addr, &client_length); char *items = {"one", "two", "three", "four", "five", "six", "seven", "eight"}; char *item_name_length = {"3", "3", "5", "4", "4", "3", "5", "5"}; ... (1 Reply)
Discussion started by: omega666
1 Replies

6. Programming

C pointer/array duality confusion

Hi all, Can anyone provide help with getting the right syntax regarding array/pointers in C in the following code? Can't locate a specific example which clarifies this... Say I declare a typedef to an array of pointers to some type... /** * An array of ptrs to sections */ typedef... (4 Replies)
Discussion started by: gorga
4 Replies

7. 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

8. UNIX for Dummies Questions & Answers

Storing pointer array in C

All .. I am having a pointer array . And trying to store the addess into that pointer array . please see below the problem i faced code: int cnt1; char *t_array; char *f_array; for(cnt1=0; cnt1<1000; cnt1++) { t_array =... (1 Reply)
Discussion started by: arunkumar_mca
1 Replies

9. Programming

pointer

void main() { int a={1,2,3,4,5,6,7,8,9,10}; int *p=a; int *q=&a; cout<<q-p+1<<endl; } The output is 10, how? if we give cout<<q it will print the address, value won't print.... if we give cout<<p it will print the address, value won't print.... p has the base addr; q... (1 Reply)
Discussion started by: sarwan
1 Replies
Login or Register to Ask a Question