内存管理的困惑:C 程序中的全局字符 *



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

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

但是,每次我执行此函数时,a 始终为空。我认为我需要对内存分配做一些事情,但我对在哪里分配它以及在哪里释放它感到困惑。谢谢!

第一次调用 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=%sn", (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

我对此感到有点羞怯。问题是我正在分叉进程,并在子进程中编辑变量的副本,而没有意识到父进程的变量不受影响。

对此感到抱歉。希望这可以帮助遇到这种情况的其他人。

我把它写成"响应"而不是问题,这样我就可以更好地格式化文本:

问题 1(如果像这样初始化,行为会改变吗?

char *a = NULL;

Q2( 您的编译器、编译器版本和操作系统是什么?

Q3(你确定没有其他代码可能弄乱"a"吗?

====

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

补遗:

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

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

相关内容

  • 没有找到相关文章

最新更新