int i[10];
i=(int)malloc(20);
とした場合、変数宣言時に確保されたメモリはどうなるのですか??
宣言時のメモリは解放され、malloc()で新たに確保された領域のみが配列として使用されるのでしょうか??
それから配列のアドレスを表示しようとして、
printf("str[0]:%p",str[0]);
と書いたのですが、どうもおかしな値が出力されます。
これはポインタ変数を使わないといけないのでしょうか??
malloc()の動作
Re:malloc()の動作
> int i[10];
> i=(int)malloc(20);
> とした場合、変数宣言時に確保されたメモリはどうなるのですか??
こういうことはできません。コンパイルエラーが出ます。
配列として確保した領域 i の先頭要素へのアドレスを、
malloc()の戻り値で上書きすることはできません。
それとも、お手元にあるコンパイラでは上記のことができたのでしょうか?
> それから配列のアドレスを表示しようとして、
> printf("str[0]:%p",str[0]);
> と書いたのですが、どうもおかしな値が出力されます。
str[/url]の先頭要素のアドレスを出力する場合、
printf("str[0]:%p",str);
のように配列名だけを書くか、あるいは
printf("str[0]:%p",&str[0]);
のように、配列の先頭要素str[0]のアドレスであることを明示するかです。
C言語では、配列名は当該配列の先頭要素のアドレスを表わします。
> i=(int)malloc(20);
> とした場合、変数宣言時に確保されたメモリはどうなるのですか??
こういうことはできません。コンパイルエラーが出ます。
配列として確保した領域 i の先頭要素へのアドレスを、
malloc()の戻り値で上書きすることはできません。
それとも、お手元にあるコンパイラでは上記のことができたのでしょうか?
> それから配列のアドレスを表示しようとして、
> printf("str[0]:%p",str[0]);
> と書いたのですが、どうもおかしな値が出力されます。
str[/url]の先頭要素のアドレスを出力する場合、
printf("str[0]:%p",str);
のように配列名だけを書くか、あるいは
printf("str[0]:%p",&str[0]);
のように、配列の先頭要素str[0]のアドレスであることを明示するかです。
C言語では、配列名は当該配列の先頭要素のアドレスを表わします。
Re:malloc()の動作
僕の勘違いでした。申し訳ありません。
//ソース
#include <stdio.h>
int main (void)
{
char str[4][4];
int count1=0,count2=0;
while(count1<=4)
{
printf("str[%d][%d]:%p\n",count1,count2,&str[count1][count2]);
count2++;
if (count2==5)
{
count2=0;
count1++;
}
}
return 0;
}
//出力結果
str[0][0]:0012FF7C
str[0][1]:0012FF7D
str[0][2]:0012FF7E
str[0][3]:0012FF7F
str[0][4]:0012FF80
str[1][0]:0012FF80
str[1][1]:0012FF81
str[1][2]:0012FF82
str[1][3]:0012FF83
str[1][4]:0012FF84
str[2][0]:0012FF84
str[2][1]:0012FF85
str[2][2]:0012FF86
str[2][3]:0012FF87
str[2][4]:0012FF88
str[3][0]:0012FF88
str[3][1]:0012FF89
str[3][2]:0012FF8A
str[3][3]:0012FF8B
str[3][4]:0012FF8C
str[4][0]:0012FF8C
str[4][1]:0012FF8D
str[4][2]:0012FF8E
str[4][3]:0012FF8F
str[4][4]:0012FF90
となったのですが、ひとつ質問があります。
例えばstr[3][4]とstr[4][0]、同じアドレスを出力していますよね。これは同じメモリを使っているということですか??
つまりstr[3][4]==str[4][0]ということなのでしょうか??
//ソース
#include <stdio.h>
int main (void)
{
char str[4][4];
int count1=0,count2=0;
while(count1<=4)
{
printf("str[%d][%d]:%p\n",count1,count2,&str[count1][count2]);
count2++;
if (count2==5)
{
count2=0;
count1++;
}
}
return 0;
}
//出力結果
str[0][0]:0012FF7C
str[0][1]:0012FF7D
str[0][2]:0012FF7E
str[0][3]:0012FF7F
str[0][4]:0012FF80
str[1][0]:0012FF80
str[1][1]:0012FF81
str[1][2]:0012FF82
str[1][3]:0012FF83
str[1][4]:0012FF84
str[2][0]:0012FF84
str[2][1]:0012FF85
str[2][2]:0012FF86
str[2][3]:0012FF87
str[2][4]:0012FF88
str[3][0]:0012FF88
str[3][1]:0012FF89
str[3][2]:0012FF8A
str[3][3]:0012FF8B
str[3][4]:0012FF8C
str[4][0]:0012FF8C
str[4][1]:0012FF8D
str[4][2]:0012FF8E
str[4][3]:0012FF8F
str[4][4]:0012FF90
となったのですが、ひとつ質問があります。
例えばstr[3][4]とstr[4][0]、同じアドレスを出力していますよね。これは同じメモリを使っているということですか??
つまりstr[3][4]==str[4][0]ということなのでしょうか??
Re:malloc()の動作
>char str[4][4];
この定義だと、
>str[0][4]:0012FF80
>str[1][4]:0012FF84
>str[2][4]:0012FF88
>str[3][4]:0012FF8C
>str[4][0]:0012FF8C
>str[4][1]:0012FF8D
>str[4][2]:0012FF8E
>str[4][3]:0012FF8F
>str[4][4]:0012FF90
これらは配列の定義範囲外であることはおわかりですか?
この定義だと、
>str[0][4]:0012FF80
>str[1][4]:0012FF84
>str[2][4]:0012FF88
>str[3][4]:0012FF8C
>str[4][0]:0012FF8C
>str[4][1]:0012FF8D
>str[4][2]:0012FF8E
>str[4][3]:0012FF8F
>str[4][4]:0012FF90
これらは配列の定義範囲外であることはおわかりですか?