この質問は、私は次のプログラムを試してみましたMalloc call crashing, but works elsewhere"malloc(sizeof(struct a *))"と "malloc(sizeof(struct a))"は同じですか?
の継続であり、私はそれが働いた( - これはあまりにも上記のリンクに記載された、すなわちがクラッシュしません)。私はそれが働くことが幸運かもしれないが、私はなぜこれが働いているのSOの専門家から合理的な説明を探していますか?ここ
malloc()
structures
w.r.tと
pointers
malloc(sizeof(struct a) * n)
を用いmemory
の割り当てに関するいくつかの基本的な理解は、タイプstruct a
要素のn
数を割り当てています。そして、このメモリロケーションは、pointer-to-type-"struct a"
を使用して格納およびアクセスすることができます。基本的にはstruct a *
です。malloc(sizeof(struct a *) * n)
struct a *
要素の番号n
を割り当てます。各要素は、struct a
の要素を指すことができます。基本的にmalloc(sizeof(struct a *) * n)
はarray(n-elements)-of-pointers-to-type-"struct a"
を割り当てます。また、割り当てられたメモリ位置は、pointer-to-(pointer-to-"struct a")
を使用して格納およびアクセスすることができる。基本的にはstruct a **
です。
我々はarray(n-elements)-of-pointers-to-type-"struct a"
を作成するときに、それはstruct a *
代わりのstruct a **
にそれを割り当てるために有効な
- のですか?
- を割り当て/参照解除するには
pointer-to-"struct a"
を使用しますか?
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
次のようにコードスニペットは、次のとおりです。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
typedef struct {
int value1;
int value2;
}data;
int n = 1000;
int i;
int val=0;
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
printf("allocation successful\n");
for (i=0 ; i<n ; i++) {
array[i].value1 = val++;
array[i].value2 = val++;
}
for (i=0 ; i<n ; i++) {
printf("%3d %3d %3d\n", i, array[i].value1, array[i].value2);
}
free(array);
printf("freeing successful\n");
return 0;
}
EDIT: 私は間違い
で、次の操作を行う場合はOKと言いますdata * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
コンパイル時に(GCC
フラグを使用してコンパイル時に)このような意図しないプログラミングの誤植を捕捉する方法はありますか?私は-Wall
を使ってこれを編集し、警告は見つからなかった!
にあなたの質問のタイトルは、なぜあなたがしたいと思う、また –
...上記のテキストの残りの部分で実際の質問と一致していないようです'malloc'の結果を間違ったものに代入して逆参照するのですか?私は質問の前提を理解していません。 –
@OliCharlesworth私は間違って意図的に行っていません!そうすれば、プログラムがクラッシュするとは思わないのですか? –