我有一个学校作业,除了一部分,一切都很好,我想不出来。以下是出现问题的代码片段:

    //something goes wrong here, wont copy over
    puts("bravo");
    //add to end of the list
    int size_list = sizeof(environ);
    //char** tmp_ptr = ( char** )calloc( size_list + 1, ( size_list + 1 ) * sizeof( char* ) );
    char** tmp_ptr = ( char** ) malloc ( ( size_list + 1 ) * sizeof( char* ) );
    int k;
    for ( k = 0; k < size_list; ++k )
    {
        tmp_ptr[k] = environ[k];
        //memcpy(tmp_ptr[k],environ[k],sizeof(environ[k]));
    }
    //char** tmp_ptr= (char**)realloc(*environ, size_list+2);
    environ = tmp_ptr;
    environ[size_list] = (char*)malloc(len_string+1);
    strcpy(environ[size_list],full_string);
    return 1;

你可以忽略“好极了”,这是为了让我找到问题发生的地方。我试图让environ拥有新的变量列表,但是当我将其设置为tmp_ptr时,它是空的。我很确定这些值会被复制过来,但我不知道出了什么问题。
函数结束时是否删除tmp_ptr中的数据?这是可能的解释吗?如何正确分配和复制内存。我试过使用realloc,但这给了我无效的指针错误,所以我依赖于calloc或malloc。提前谢谢。

最佳答案

environ的长度不是sizeof(environ),因为environ是一个char **(因此sizeof(environ)是4或8,这取决于您的平台)。您所做的是有效地清除大部分environ,因为您只复制前几个条目。
要了解environ中有多少个条目,请执行以下操作

int cnt = 0;
char **envp = environ;
while(*envp++) cnt++;

我还应该注意这个方法的一个问题:由于environ是一个以NULL结尾的字符串数组(不要与'null-terminated string'混淆),您必须用自己的条目替换结尾的NULL,然后在新条目之后添加一个新的NULL。当前,您的代码(如果它正确计算了大小)将在NULL之后添加您的条目,并且程序将看不到它。
旁注:绝对不建议用这种方式处理environ。请改用getenv/setenv;如果需要对环境进行大规模设置,请改用execve。(因此,在您的情况下,您可以简单地setenv("varname", "varvalue", 1)varname=varvalue添加到环境中(如果已经设置,则将现有映射替换为varname)。

关于c - 指针未传输到分配的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12575071/

10-09 08:46