2016-08-19 10 views
0

C++プログラムから環境変数にアクセスしようとしています。だから私は正常に動作テストプログラムを作った:C/C++プログラムから環境変数にアクセスできない

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

int main() 
{ 
    printf("MANIFOLD : %s\n", getenv("MANIFOLD_DIRECTORY")); 
    return(0); 
} 

出力:MANIFOLD : /home/n1603031f/Desktop/manifold-0.12.1/kitfox_configuration/input.config

注:getenvでの署名がある:

char *getenv(const char *name); 

しかし、私はの一部としてこれを使用する場合多くのファイルがリンクされた大きなプログラム:

energy_introspector->configure (getenv("MANIFOLD_DIRECTORY")); 

上記は機能しません。

char *a = new char [1000]; 
a = getenv("MANIFOLD_DIRECTORY"); 
energy_introspector->configure (a); 

以上も動作しません。

注:構成する機能の署名:

void configure(const char *ConfigFile); 

エラーメッセージ:

Number of LPs = 1 
[Ubuntu10:18455] *** Process received signal *** 
[Ubuntu10:18455] Signal: Segmentation fault (11) 
[Ubuntu10:18455] Signal code: Address not mapped (1) 
[Ubuntu10:18455] Failing at address: (nil) 
[Ubuntu10:18455] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x10330) [0x7f9a38149330] 
[Ubuntu10:18455] [ 1] /lib/x86_64-linux-gnu/libc.so.6(strlen+0x2a) [0x7f9a37dfc9da] 
[Ubuntu10:18455] [ 2] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x5bf8c4] 
[Ubuntu10:18455] [ 3] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x5a4ac6] 
[Ubuntu10:18455] [ 4] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x5a4df8] 
[Ubuntu10:18455] [ 5] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x4283b6] 
[Ubuntu10:18455] [ 6] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x41e197] 
[Ubuntu10:18455] [ 7] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x41de7a] 
[Ubuntu10:18455] [ 8] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x41d906] 
[Ubuntu10:18455] [ 9] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x41710b] 
[Ubuntu10:18455] [10] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f9a37d95f45] 
[Ubuntu10:18455] [11] /home/n1603031f/Desktop/manifold-0.12.1/simulator/smp/QsimLib/smp_llp() [0x41697f] 
[Ubuntu10:18455] *** End of error message *** 
-------------------------------------------------------------------------- 
mpirun noticed that process rank 0 with PID 18455 on node Ubuntu10 exited on signal 11 (Segmentation fault). 
-------------------------------------------------------------------------- 

しかし、これは動作します:

energy_introspector->configure ("/home/n1603031f/Desktop/manifold-0.12.1/kitfox_configuration/input.config"); 
+0

'getenv'は' configure'の中に他にも呼び出すことができますか? 'getenv'が呼び出されるたびに、最後の呼び出しの結果が無効になることがあります。 –

+0

@TheDark No. 'configure 'から' getenv() 'を呼び出すことはありません。 – PRP

+0

C++の' new char [1000] 'には正当な理由はほとんどありません。 'std :: string'、' std :: vector '、' std :: array 'のいずれかが良い選択です。この場合、 'std :: string a = getenv();' – MSalters

答えて

3

getenvは、プログラムによって所有されていないのライブラリ割り当てメモリへのポインタを返します。あなたの

a = new char [1000] 

行は、これを認識しておらず、メモリを提供する必要があると思われることを示しています。それは本当ではない、特にあなたはかもしれないgetenvによって返されたメモリを解放することはありません。それは正しいだろう場合でも、あなただけのポインタを交換し、メモリをコピーしていないよう

(、シンプルなポインタ代入

a = getenv... 

はまだ、間違っているでしょう。ラインは、あなたのようにメモリリークしていること

あなたのプログラムがそのメモリを所有するようにしたい場合は、あとでfreeにする必要があります。私たちのプライベートメモリスペースにコピーする必要があります。

a = new char [1000]; 
e = getenv (<whatever>); 
strcpy (a, e); 

残念ながら、私はあなたがfreeまたはdeleteそれにしようとする場合は特に、あなたの他の例では、後にポインタであなたが何をするかを見ることができません。どちらもエラーにつながります。

+0

あなたの解決策は何ですか?何かありますか? – PRP

+0

btw .... 'a =新しいchar [1000]; e = getenv(​​); strcpy(a、e); 'は動作しません – PRP

+1

@PRPそして*正確には「動作しません」とは何ですか? – tofro

1

コード内の最初の明示的なエラーは、char配列の割り当てであり、次にgetenvという結果を割り当てます。これはメモリリークを引き起こします。これは、変数aに結果を保存し、未設定の環境変数にあなたのコードの免疫を作る

std::string a = getenv("MANIFOLD_DIRECTORY"); 

:あなたのケースでの使用には。

getenvがNULLを返した場合、指定された名前の変数は、アプリケーションに渡される環境にありません。以下のようなコードで利用可能な環境変数をすべて列挙してみてください。

extern char** environ; 

for (int i = 0; environ[i] != NULL; ++i) { 
    std::cout << environ[i] << std::endl; 
} 

変数がリストされていない場合、おそらくアプリケーション呼び出しの問題です。もう1つの選択肢は、環境が設定されていないことです。

関連する問題