【发布时间】:2016-09-25 19:29:32
【问题描述】:
我正在编写一个玩具 bash shell。我现在的目标是在环境中循环寻找可以找到特定命令的路径。现在我正在用“:”分隔路径(例如“/home/user/bin:home/user/.local/bin:/usr/local/sbin”等),并且对于给我的每个路径,复制那个新字符串finalPath的路径,然后将“/cmd”连接到末尾。
我的问题是,当我尝试将路径的内容复制到 finalPath 时,我对 finalPath 所做的任何更改都会反映到路径上。正如现在的代码一样,path 只会被设置为“home/user/bin”一次,循环并再次设置为相同的东西,然后标记器命中“NULL”并终止 while 循环。
这表明path 和finalPath 正在共享一个内存地址,但由于 strcpy 理论上会在内存中创建一个新副本,因此我的字符串和指针一定有问题。
知道是什么导致了这种意外行为吗?
编辑:当我注释掉 strcpy 时,此代码按预期执行
我的代码的精简版本如下:
int findpath(char* cmd, command_t* p_cmd) {
char* path_var;
path_var = getenv( "PATH" );
char* path;
char tempEnv[sizeof(path_var)];
strcpy(tempEnv, path_var);
path = strtok(tempEnv, ":");
while(path != NULL) {
char fullPath[1000];
strcpy(finalPath, path);
printf("path: %s\n", path);
printf("finalPath: %s\n", finalPath);
path = strtok(NULL, ":");
}
【问题讨论】:
-
是的,
strtok确实改变了源字符串。这是记录在案的行为。 -
sizeof(path_var)不是path_var的长度。这是指针大小。 -
Strtok 更改源字符串很好,我对 strcpy 感到困惑。编辑:一些澄清是,当我注释掉 strcpy 时,这段代码循环正常
-
finalPath未在代码中的任何位置声明