Can';t使用execve传递第二个环境变量

Can';t使用execve传递第二个环境变量,c,execve,C,Execve,我想使用execve()函数显示作为参数传递给另一个进程的2个环境变量: 主要条款c: int main(){ char USERNAME[10]; strcpy(USERNAME, "USERNAME="); for (int i=1;i<10;i++){ strcpy(USERNAME+i, "1"); } char PATH[169]; strcpy(PATH, "PATH="); for (int i=5

我想使用execve()函数显示作为参数传递给另一个进程的2个环境变量:

主要条款c:

int main(){


    char USERNAME[10];
    strcpy(USERNAME, "USERNAME=");
    for (int i=1;i<10;i++){
        strcpy(USERNAME+i, "1");
    }

    char PATH[169];
    strcpy(PATH, "PATH=");
    for (int i=5;i<169;i++){
        strcpy(PATH+i, "A");
    }


    char * newargv[] = {"./get","", (char*)0};
    char * newenviron[] = {PATH,USERNAME};
    execve("./get", newargv, newenviron);
    return 0;
}
因此,我将Main.c编译为Main,将get.c编译为get,并执行Main,我得到以下输出:

路径 :aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 用户名:(空)


我不明白为什么用户名在这里是空的。

您的
newenviron
数组末尾缺少一个空终止符。此外,向每个字符串写入的字节数比分配的空间多(结尾\0计为一个字符)。

newenviron
数组的结尾缺少空终止符。此外,您向每个字符串写入的字节比分配的空间多(结尾\0计为一个字符)。

如果我的坏,我会删除用户名选项卡的“USERNAME=”部分,因为循环从1开始,而不是9

如果我的坏,我会删除用户名选项卡的“USERNAME=”部分,因为循环是从1开始的,而不是从9开始的。…

您可以尝试执行
printf(“\n”,用户名)在第一个程序的循环内。你会发现它并不包含你的想法。或者更好,学习如何使用调试器。@WeatherVane,嗯
strcpy
是初始化它的工具。@JosephSible mybad,但循环中最后一个
strcpy
将溢出数组,因为终止的
'\0'
。与用户密切相关。您可以尝试执行
printf(“\n”,用户名)在第一个程序的循环内。你会发现它并不包含你的想法。或者更好,学习如何使用调试器。@WeatherVane,嗯
strcpy
是初始化它的工具。@JosephSible mybad,但循环中最后一个
strcpy
将溢出数组,因为终止的
'\0'
。与用户密切相关。您的意思是like
char*newenvironment[]={PATH,USERNAME,NULL}?它不起作用……是的,你需要这样做。“不起作用”是什么意思?你做的时候到底发生了什么?您是否修正了字符串大小?您的意思是像
char*newenviron[]={PATH,USERNAME,NULL}?它不起作用……是的,你需要这样做。“不起作用”是什么意思?你做的时候到底发生了什么?你修好绳子的尺寸了吗?arf!第二个printf显示用户名和路径,如何防止这种情况发生?正如已经告诉您的,您缺少跟踪零
\0
arf!第二个printf显示用户名和路径,如何防止这种情况发生?正如已经告诉您的,您缺少跟踪零
\0
int main()
{
    const char* s = getenv("PATH");
    printf("PATH :%s\n",s);
    const char* s2 = getenv("USERNAME");
    printf("USERNAME :%s\n",s2);
}