问题
我发现我直接使用如下程序,可以直接设置环境变量:
const char name1[6]="SHELL"; const char name2[8]="USENAME"; const char vaule[4]="zqh"; putenv("SHELL=zqh"); putenv("USENAME=zqh"); printf("%s\n", getenv(name1)); printf("%s\n", getenv(name2));
|
结果如下:
但是
当我使用函数的时候,自己将字符串赋值进去的时候,却无法修改环境变量:
int my_setenv(const char *name,const char *var) { char *pbuf = NULL; if (getenv(name) == NULL) { printf("now add %s\n",name); } else { printf("now modfiy %s\n",name); } pbuf = (char *)malloc(strlen(name)+1 + strlen(var)+1 + 1); if (NULL == pbuf) { return -1; } sprintf(pbuf, "%s=%s", name, var); printf("pbuf %s\n",pbuf); printf("putenv %d\n",putenv(pbuf)); free(pbuf); return 0; }
int main(int argc, char const *argv[]) { const char name1[6]="SHELL"; const char name2[8]="USENAME"; const char vaule[4]="zqh"; my_setenv(name1,vaule); my_setenv(name2,vaule); printf("%s\n", getenv(name1)); printf("%s\n", getenv(name2)); return 0; }
|
结果如下: now modfiy SHELL pbuf SHELL=zqh putenv 0 now add USENAME pbuf USENAME=zqh putenv 0 [1] 7326 segmentation fault (core dumped) ./6-3
|
可以看出,设置变量貌似是成功了,但是当我想获取我设置的变量值时,就会出现segmentation
fault的错误。这是由于我想printf一个NULL指针引发的。
这个就非常令人难受了,我在函数内打印pbuf的值,发现他的值的确是我要输入的值,但是却还是不能正确的putenv。
修复过程
我现在尝试把东西放在主函数中运行,程序如下:
int main(int argc, char const *argv[]) { const char name1[6]="SHELL"; const char name2[8]="USENAME"; const char vaule[4]="zqh"; char *pbuf=NULL; pbuf=(char*)malloc(strlen(name1)+strlen(vaule)+1); sprintf(pbuf,"%s=%s",name1,vaule); printf("%s\n", getenv(name1)); putenv(pbuf); printf("%s\n", getenv(name1)); return 0; }
|
结果:
现在非常正常,但是为什么我放在函数中运行,就会失败呢?接下来我尝试继续使用函数。
使用函数:
现在我把他放到函数中:
int my_setenv(const char *pName,const char *pVar) { char *pbuf=NULL; pbuf=(char*)malloc(strlen(pName)+strlen(pVar)+1); sprintf(pbuf,"%s=%s",pName,pVar); printf("%s\n", getenv(pName)); putenv(pbuf); printf("%s\n", getenv(pName)); }
int main(int argc, char const *argv[]) { const char name1[6]="SHELL"; const char name2[8]="USENAME"; const char vaule[4]="zqh"; my_setenv(name1,vaule); return 0; }
|
运行结果:
解决问题
很无语,现在写的这个函数,与原来没有什么区别,但是就是没有问题。所以这个问题我解决了,但是就好像没有解决一般。令人难受。