2016-05-26 10 views
1

ポインタstoreNameに値を格納していますが、後でコールバック付きのプログラムでアクセスしようとすると、storeNameは空です。私はそれがnameparentの機能はローカルであると信じています。 parent機能を変更することは私のコントロールではありません。 setNameファンクションのstoreNameに値を格納する最良の方法は、storeNameを後で使用することができます。コード後で使用するためのポインタ値の保存

//*storeName is empty 

で他のいくつかの時点で

void parent() 
{ 
    uint8_t name[] = "James"; 
    setName(name); 
} 

static uint8_t* storeName; 

void setName(uint8_t* name) 
{ 
    storeName = name; 
} 

...(注:上記のコードだけ手で問題を説明するための簡易版である)

+2

storeNameはポインタではありません。 "James"は8ビット整数ではありません。このコードは非常に奇妙です。 –

+0

申し訳ありませんがタイプミスでした。固定されました – vow

+2

'parent'の' name'と同じです - 型に '*'がありません。 –

答えて

3

あなたはアドレスを渡していますローカル変数の配列nameparentの場合は、parentが終了するとスコープの外に出るため、その変数を指すポインタは現在不特定のメモリ位置を指しており、アクセスすると未定義の動作になります。

あなたはこのようnameを定義する場合:

uint8_t *name = "James"; 

そして、それは、関数の外で安全に読み取ることができるメモリの読み出し専用のセクションに住んでいる文字列定数を指します。これは、配列を初期化するために定数文字列が使用されたという点で前の宣言と異なります。この場合、実際の定数へのポインタがあります。

+0

これはgccで動作します。しかし、 'warning:initializing' uint8_t * '(別名' unsigned char * ')は、 の型' char [6] 'の式との間で、 の異なる記号[-Wpointer- sign] uint8_t * name = "James"; ' – user3078414

関連する問題