0

char *私は、常に変化するグローバルなプログラムを持っています。現在、 の場合は値に設定し、そうでNULLない場合は変更します。ただし、NULLポインターを設定していても、決してそうではありません。私が言っていることの例:

char *a;

void function()
{
    if(a == NULL)
    {
         a = "Test1";
    }
    else
    {
         a = "Test2";
    }
}

ただし、この関数を実行するたびに、a は常に null です。メモリ割り当てで何かする必要があると思いますが、どこに割り当て、どこで解放するかについて混乱しています。ありがとう!

4

3 に答える 3

1

function()が初めて呼び出されると、Cのグローバル変数がゼロに初期化されるため、「a」はNULLになります。

次に、「Test1」を指すように設定します。2回目にfunction()が呼び出されても、「a」はNULLではなく「Test1」へのポインタであるため、「Test2」に設定します。今後のすべての呼び出しは基本的に何も行わず、「a」を「Test2」に何度も設定します。

それが表示されていない場合は、上記で投稿したコードと比較して、実際のコードに何か違いがあります。たとえば、「char * a」が関数内にある場合、それはグローバルではなくローカル変数であり、関数の開始時に未定義の値になり、関数が終了するたびにその値を失います。

以下のコードは、必要に応じて、その下に出力を生成しました。

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

char *a;

void function();

int main( int argc, const char *argv[] )
{
    function();
    function();
    function();
    function();

    return 0;
}


void function()
{
    printf( "function: a=%s", (a ? a : "NULL") );

    if(a == NULL)
    {
         a = "Test1";
    }
    else
    {
         a = "Test2";
    }

    printf( "  exiting a=%s\n", (a ? a : "NULL") );
}


This produces the following output:

function: a=NULL  exiting a=Test1
function: a=Test1  exiting a=Test2
function: a=Test2  exiting a=Test2
function: a=Test2  exiting a=Test2
于 2012-09-11T23:30:05.503 に答える
1

私はこれに少し恥ずかしさを感じます。問題は、親プロセスの変数が影響を受けていないことに気付かずに、プロセスをフォークし、子プロセスの変数のコピーを編集していたことです。

申し訳ありません。これが、これに遭遇した他の誰かに役立つことを願っています。

于 2012-09-11T23:37:48.120 に答える
0

テキストをより適切にフォーマットできるように、これを質問ではなく「応答」として書いています。

Q1) このように初期化すると挙動は変わりますか?

char *a = NULL;

Q2) コンパイラ、コンパイラのバージョン、OS は?

Q3) 「a」をいじっている可能性のあるコードが他にないのですか?

==================================================

補遺:

Q: 分岐後に子プロセスで変数の値を編集していることに気付きました。それが問題でしょうか?– メイソン

A: 1 つのプロセスで変数を変更すると、何らかの方法で他のプロセスが変更されることが予想される場合のみ (共有メモリ セグメントを割り当てずに) ;)

于 2012-09-11T23:15:34.497 に答える