我有一个程序,我有一个全局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"吗?
====
======================================================补遗:
问:我刚刚意识到我在分叉后正在子进程中编辑变量的值。这可能是问题所在吗?–石匠
答:仅当您期望更改一个进程中的变量会以某种方式更改另一个进程(不分配共享内存段(时;)