As you said I did a test of memory access:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h> /* ptrdiff_t */
#include <alloca.h> /* only test alloca */
#include <string.h>
extern void afunc(void);
int bss_var; /* Auto init to 0 ,should be in BSS */
int data_var = 42; /* Init is not 0, should be in Data Sigment */
int main(int argc,char **argv){
char *p,*b,*nb;
char *str ="aaa";
char s[] = "aaa";
char *pt =NULL;
pt = (char *)malloc(sizeof(char *) * 5);
strcpy(pt,"aaa");
printf("Text locations:\n");
printf("\tAddress of main:%p\n",main);
printf("\tAddress of afunc:%p\n",afunc);
printf("Stack Locations:\n");
afunc();
p = (char *)alloca(32);
if(p != NULL){
printf("\tStart of alloca()'ed array : %p\n",p);
printf("\tEnd of alloca()'ed array : %p\n",p+31);
}
printf("Data Locations:\n");
printf("\tAddress of data_var : %p\n", & data_var);
printf("BSS Locations:\n");
printf("\tAddress of bss_var : %p\n", & bss_var);
b = sbrk((ptrdiff_t) 32); /* increase mem size */
nb = sbrk((ptrdiff_t) 0); /* get mem end address */
printf("Heap Locations: \n");
printf("\tInitial end of heap: %p\n",b);
printf("\tNew end of heap: %p\n",nb);
b = sbrk((ptrdiff_t) -16); /* decrease mem size */
nb = sbrk((ptrdiff_t) 0);
printf("\tFinal end of heap : %p\n",nb);
printf("str:%p\n",str);
printf("s:%p\n",s);
printf("pt:%p\n",pt);
return 0;
}
void afunc(void){
static int level = 0;
auto int stack_var;
if(++level == 5){
return;
}
printf("\tStack level %d: address of stack_var: %p\n",level, &
stack_var);
afunc(); /* cycle */
}
-----------------------------------------------
And result is:
Text locations:
Address of main:0x80483c4
Address of afunc:0x80485a8
Stack Locations:
Stack level 1: address of stack_var: 0xbfffe124
Stack level 2: address of stack_var: 0xbfffe114
Stack level 3: address of stack_var: 0xbfffe104
Stack level 4: address of stack_var: 0xbfffe0f4
Start of alloca()'ed array : 0xbfffe110
End of alloca()'ed array : 0xbfffe12f
Data Locations:
Address of data_var : 0x804989c
BSS Locations:
Address of bss_var : 0x80499a8
Heap Locations:
Initial end of heap: 0x804b000
New end of heap: 0x804b020
Final end of heap : 0x804b010
str:0x80486c0
s:0xbfffe134
pt:0x8049a00
-----------------------------------------------------------------------------------
If you want to do that I guess source will be :
#include <stdio.h>
#include <string.h>
int main(void){
char *str = NULL;
str = (char *)malloc(sizeof(char *)*5);
strcpy(str,"abcd");
str[0] = 's' ;
printf("%s\n",str);
free(str);
return 0;
}
In following code
char str[] = "asdf" ;
str[0] = 's' ;
is possible.
But char *str = "asdf" ;
str[0] = 's' ;
is an run-time error.
What i understand is *str = "asdf" is stored in Read-only-Memory. Where
as str[] is stored in stack.
Does any body has any better explanation for that?