2017-11-04 15 views
0

私は上記のエラーがありますので、私は可能な限り明確にしようとします。"アクセス違反の書き込み場所0x00000000457E8770" Cでmallocを使用

短い説明:

私は新しい構造defininngよ:子供を、と私は種類の子供の新しい配列にメモリ内のスペースを割り当てたいです。 私はmalloc(私のチェックで - >失敗しなかった)をしていて、配列の場合はフィールドの1つに書き込もうとしていますが、タイトルにエラーがあります。 動的割り当てを行ったにもかかわらず、なぜ私はこれらのフィールドに書き込めないのか分かりません。

コメント付きコード:

私は構造体を定義したが、次のように子供を呼ば:

typedef struct 
{ 
    char name[16]; 
    candy *kid_candy; 
} kid; 

(お菓子は私が定義された別の構造体である、私はそれをコピーするneccesaryです必要はありません。彼の定義)

上記の定義は、以下のコードに含まれているhファイルに書かれています。

#include "kindergarten.h" 
void AllocateKidsArray(int size); 

int main() 
{ 
    AllocateKidsArray(3); 
} 

void AllocateKidsArray(int size){ 

    kid *p_kids_arr = NULL; 
    int i ; 
    char blank[16] = {' '}; 

//In the next line want to allocate space for an array,that his type is kid: 
    p_kids_arr = (kid*)malloc(size * sizeof(kid)); 

// checking if allocation failed 
    if (p_kids_arr == NULL) 
    { 
     return -1; 
    } 
    else 
    { 
     for (i = 0; i < size; i++) 
     { 

//now im trying to change a field in the array I allocated before: 
      (p_kids_arr + sizeof(kid)*i)->kid_candy = NULL; 
//but I always get the error from the title 
     } 

    } 
} 

概要:私はオンライン解決のために、そのエラーを持っていた人々のほとんどを見たとき、彼らはstaitclyポインタを宣言し、それらへの書き込みしようとしたので、

、それを持っていました。 しかし、私の場合、私はmallocをやっていますが、私はちょうど問題が何であるかを理解することができません。そして、それは何か基本的なもののように見えます。

私は何が欠けているのか、何が間違っているのかを理解することは非常に重要です。コードを修正する必要はありません。なぜ私が動的に割り当てたフィールドに書き込むことができないのか理解することです。あなたの助け。

ありがとうございます!

+2

なぜ配列メンバーにアクセスするときに 'sizeof(kid)'で 'i'を掛けますか? – alk

+1

あなたの実際のコードには「」も含まれていますか? – alk

+0

Cでは、 'malloc()'の結果をキャストする必要はありません。それは役に立たず、本当の間違いを隠す可能性が高いので、 '(kid *)'を削除してください。 – alk

答えて

1

なぜこれでこの

 (p_kids_arr + sizeof(kid)*i)->kid_candy = NULL; 

を交換しない:

 p_kids_arr[i].kid_candy = NULL; 

上記の2つが同じではありません。なぜなら、実際にはポインタの算術のためにタイプintのポインタに1を加えると、それに4バイト(intポインタのサイズが4バイト)が追加されているからです(最初のバージョンはp_kids_arrに必要以上に多くのバイトを追加します)。コメントで述べたように

はまた、あなたが#include <stdlib.h>

が欠落していて、タイプvoidを返している機能でreturn -1;をやっているので、あなたが警告を受け取っているはずと思われます。

+0

私はこのフォームを前に試しましたが、私のために働いていませんでした。 助けてくれてありがとう – albert1905

+2

@ albert1905本当ですか?たぶんあなたの問題はささやきでした。それ以外は? –

+1

また、次のようにしてください: '(p_kids_arr + i) - > kid_candy = NULL;' – alk

関連する問題