gpt4 book ai didi

c - 指针没有被转移到分配的内存

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:12 25 4
gpt4 key购买 nike

我有一项学校作业,除了一个我无法弄清楚的部分外,一切都很好。以下是出现我的问题的代码片段:

    //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;

你可以忽略“bravo”,这是让我定位问题发生的地方。我试图让 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 结尾的字符串”混淆),您必须用自己的条目替换末尾的NULL,然后在新条目后添加一个新的NULL。目前,您的代码(如果它正确计算了大小)会在 NULL 之后添加您的条目​​,并且不会对程序可见。

旁注:绝对不推荐以这种方式搞乱 environ。使用 getenv/setenv 代替;如果您需要批量设置环境,请尝试使用 execve 代替。 (因此,在您的情况下,您可以简单地 setenv("varname", "varvalue", 1)varname=varvalue 添加到环境中(并替换现有映射到 varname(如果已经设置)。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com