2017-08-27 16 views
0

this questionへの回答では、メモリを割り当てて呼び出し関数に返す方法について説明しています。例を挙げました:どのようにしてメモリを割り当て、値を割り当て、呼び出し元関数に返すのですか?

私は呼び出し元関数に戻る前に値を割り当てたいと思います。しかし、私が(例えば)試してみると:

void someFunction (int **data) { 
    *data = malloc (2 * sizeof (int)); 
    *data[0] = 1; 
    *data[1] = 1; 
} 

void useData (int *data) { 
    printf ("%p", data); 
} 

int main() { 
    int *data = NULL; 

    someFunction (&data); 

    useData (data); 

    return 0; 
} 

私はセグメント違反を受け取ります。どんな助けもありがとうございます。

+1

または 'data [0] [0] = 1;データ[0] [1] = 1; ' – BLUEPIXY

答えて

3

あなたの問題は、声明である:

*(data[0]) = 1; 

ではなく、のように:優先順位は(a)はを動作する方法のため、これは実際に相当なので

*data[0] = 1; 

あなたは期待しました:

(*data)[0] = 1; 

前者のバリアントは、実際にはまだ割り当てられていない(任意の)値を逆参照しようとします。これがクラッシュの原因となります。より明示的にするには、後者の形式を使用する必要があります。

は、間違った前提に基づいて後で問題を起こさないように失敗するコールを常にチェックすることをお勧めします。また、関数を2回(またはそれ以上)呼び出すと何が起きるか検討したいかもしれません。古いメモリは決して解放されないので、現在はメモリリークが発生します。次のように心の中でこれらのポイントで

、私は少しあなたの機能を変更することになります。

void someFunction (int **data) { 
    // Release old memory if any (freeing NULL is fine). 

    free (*data); 

    // Allocate new memory and initialise only if it worked. 

    *data = malloc (2 * sizeof (int)); 
    if (*data != NULL) { 
     (*data)[0] = 1; 
     (*data)[1] = 1; 
    } 
} 

(a)の優先順位が標準で表現型の出現の順序によって決定されます。例えば、C11 6.5 Expressions状態:

構文は、本節の主要な副次句のため、最初の最高の優先順位と同じ表現の評価に演算子の優先順位を指定します。

そして、配列の添字が6.5.3.2に間接に比べ6.5.2.1に表示されているので、前者は最初が起こるのだろう。

2

ポインタロジックを簡略化すると便利なことがあります。

たとえば、以下のコードでは、メモリの割り当てと初期化は、ではなく、より使い慣れたint *を使用して行われます。その後、割り当ておよび初期化の後、割り当てられたメモリはint **を介して呼び出し側に返されます。

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 

#define SUCCESS 0 

int SomeFunction(int **OUT_data) 
    { 
    int rCode = SUCCESS; 
    int *data = NULL; 

    errno=SUCCESS; 
    data = malloc(2 * sizeof(int)); 
    if(!data) 
     return(errno); 

    data[0] = 10; 
    data[1] = 20; 

    *OUT_data = data; 

    return(rCode); 
    } 

void UseData(int *data) 
    { 
    printf("Data[%p]: %d, %d\n", data, data[0], data[1]); 
    } 

int main() 
    { 
    int rCode = SUCCESS; 
    int *data = NULL; 

    rCode=SomeFunction(&data); 
    if(rCode) 
    { 
    fprintf(stderr, "SomeFunction() reports: %d %s\n", rCode, strerror(rCode)); 
    return(rCode); 
    } 

    UseData(data); 

    return(rCode); 
    } 
関連する問題