0

我有一个程序,我有一个全局变量char *,我会不断地改变它。现在,当它是 时,我将它设置为一个值NULL,并在它不是时更改它。但是,NULL即使我正在设置指针,它也永远不会。我所说的一个例子:

char *a;

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

但是,每次我通过这个函数时,a 总是为空。我认为我需要对内存分配做一些事情,但我对分配它的位置以及释放它的位置感到困惑。谢谢!

4

3 回答 3

1

第一次调用 function() 时,'a' 将为 NULL,因为 C 中的全局变量被初始化为零。

然后将其设置为指向“Test1”。第二次调用 function() 时,'a' 仍然是指向“Test1”的指针,而不是 NULL,因此您将其设置为“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) 你的编译器、编译器版本和操作系统是什么?

Q3)您确定没有其他代码可能与“a”混淆吗?

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

附录:

问:我刚刚意识到我在分叉后在子进程中编辑变量的值。这可能是问题吗?– 梅森

答:仅当您希望更改一个进程中的变量以某种方式更改另一个进程时(不分配共享内存段);)

于 2012-09-11T23:15:34.497 回答