我想在C中创建一个可以获取环境变量的代码,然后使用strstr从该结果中搜索特定的单词。我使用的是UBUNTU OS和gcc编译器。这是我写的代码。评论是我预期会发生的事情。返回指针时的分段错误
#include <stdio.h>
#include <string.h>
#include <unistd.h>
extern char **environ;
extern char **tmp;
extern char **tmp2;
char *search_string(char *tmp,int x)
{
char string[]="ABC"; //I'm looking for ABC in the environment variable
char *pointer;
pointer=strstr(tmp,string); //pointer will point to the result of strstr
if(pointer != NULL)
{ printf("%s ,",tmp);
printf("data found : %s \n",pointer);
} else {
//hope to do something
}
return (pointer);
}
int main(char *tmp2)
{
int x = 0;
for(x=0;environ[x]!='\0';x++){ //I'm expecting it to keep looping until finish
tmp2=search_string(environ[x],x); //tmp2 will point to the function return value
printf("%s\n",tmp2); //print the return value
} //If the search_string return NULL, does it consider string or something else?
return 0;
}
运行代码后,它因为核心转储而崩溃。这里是输出。
ABC=/tmp ,data found : ABC=/tmp
ABC=/tmp
Segmentation fault (core dumped)
从我看到的,它只能做一次search_string。然后它崩溃。然后我用gdb的什么行它真正崩溃,找出和这里的结果:
Starting program: /home/fikrie/a.out
ABC=/tmp ,data found : ABC=/tmp
ABC=/tmp
Program received signal SIGSEGV, Segmentation fault.
__strlen_ia32() at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
我不从调试不解的是,它的接收,因为SEGV信号的误差。有人能指出我如何解决这个问题吗?是否因为search_string返回NULL值?
'environ [x]'包含什么? 'main'中的参数列表是非标准的。 'environ指向char的指针 - 可能是问题出在那里。 – Sadique
我很惊讶你可以遍历'environ [x]'直到找到NULL - 并且注意你应该真的测试NULL而不是'\ 0',因为这是一个指针... – Floris
@Acme the environ [x]包含可以获取环境变量的指针。通过打印environ [x],我应该在/ etc/profile中获得environtment变量。 –