C言語の文字列のメモリ上の取り扱いについて
Posted: 2013年9月05日(木) 19:08
Cの勉強をしている中で
#include <stdio.h>
int main(){
char a[] = "this is char a[]\n";
printf("%s",a);
printf("char a[] pointer size is %d\n",sizeof(a));
a[0] = 'z';
printf("%s",a);
char *b = "this is char *b\n";
printf("%s",b);
printf("char *b pointer size is %d\n",sizeof(b));
*b = 'z';
printf("%s",b);
char *c = a;
printf("%s",c);
printf("char *c pointer size is %d\n",sizeof(c));
return 0;
}
というプログラムはchar a[]でa が配列の大きさを持っていますが、a にはアドレスが入るのでコンパイル時にaの大きさを記録した変数が裏で生成されているのでしょうか?
一般的にローカル変数はスタックに入るというのですがCASL2を今のところ勉強した限りスタックとは別の関数に飛ぶ時の元の関数の変数の避難場所であってスタックに自動変数を入れるとLIFOみたいになるので大変になるのではないでしょうか?
char *bでは文字列を変更できないとなっていますがなぜでしょうか?書き換え不可メモリ部分って何でしょうか?ROMですか?
#include <stdio.h>
int main(){
char a[] = "this is char a[]\n";
printf("%s",a);
printf("char a[] pointer size is %d\n",sizeof(a));
a[0] = 'z';
printf("%s",a);
char *b = "this is char *b\n";
printf("%s",b);
printf("char *b pointer size is %d\n",sizeof(b));
*b = 'z';
printf("%s",b);
char *c = a;
printf("%s",c);
printf("char *c pointer size is %d\n",sizeof(c));
return 0;
}
というプログラムはchar a[]でa が配列の大きさを持っていますが、a にはアドレスが入るのでコンパイル時にaの大きさを記録した変数が裏で生成されているのでしょうか?
一般的にローカル変数はスタックに入るというのですがCASL2を今のところ勉強した限りスタックとは別の関数に飛ぶ時の元の関数の変数の避難場所であってスタックに自動変数を入れるとLIFOみたいになるので大変になるのではないでしょうか?
char *bでは文字列を変更できないとなっていますがなぜでしょうか?書き換え不可メモリ部分って何でしょうか?ROMですか?