2011-07-23 28 views
1

この問題の原因を見つけることができませんでした。Cスタイルの文字列のポイントの配列へのポインタC++/cli

機能getfruitsはCスタイルの文字列のポアントの配列へのポインタを返します。 メインはCスタイルの文字列にアクセスしようとします。

using namespace System; 

#pragma managed 
void getfruits(char ***list, int* count) 
{ 
    char *txt[] = 
    { 
     "apple", 
     "orange", 
     "pears", 
     "banana", 
    }; 
    *list = txt; 
    *count = 4; 
} 

#pragma managed 
int main(array<System::String ^> ^args) 
{ 
    char **lst; int cnt;  
    getfruits(&lst,&cnt); 

    char *t; int i; 
    String^ s; 
    for (i=0; i<cnt; i++) 
    { 
     t = lst[i]; //t = <undefined value> 
     s = gcnew String(t); 
     Console::WriteLine("Fruit = {0}", s); 
    }; 
    Console::ReadKey(); 

    return 0; 
} 

しかし、それは、Cスタイルの文字列へのポインタの代わりにを取得します。

結局

型 'System.AccessViolationException' の未処理の例外はarraysandclasses.exe

で発生しました追加情報:読み取りまたは書き込み保護されているメモリをしようとしました。これはしばしば、他のメモリが壊れていることを示します。

どうしたらいいですか?誰かが何かを指摘できますか?コードをコピーして貼り付けるだけでコードをコンパイルする必要があります。前もって感謝します。

答えて

1

ローカル配列のアドレスを返して使用しました。それはundefined behaviorです。 txtには自動保存期間があり、getfruit機能を終了するとすぐに破棄されます。しかし、あなたはそれへのポインタを保持し、それを使用しますが、指摘されたメモリにはもはや生きたオブジェクトが含まれません。おそらくgood C++ bookを読むべきです。