在C中从指针列表中设置指针内容

在C中从指针列表中设置指针内容,c,pointers,C,Pointers,我现在对指针很困惑,所以我希望有人能帮助我在哪里出错 所以我想有一个指向某些结构的指针列表,一个变量有指向所有结构的指针。该列表还应在以后根据设置的某些条件进行更改。这里只是一个简单的例子: typedef struct { int a; } path; typedef struct { path** all_paths; } has_them; int main(int argc, char** argv){ path* eno = malloc(sizeof(path));

我现在对指针很困惑,所以我希望有人能帮助我在哪里出错

所以我想有一个指向某些结构的指针列表,一个变量有指向所有结构的指针。该列表还应在以后根据设置的某些条件进行更改。这里只是一个简单的例子:

typedef struct {
int a;

} path;

typedef struct {

path** all_paths;

} has_them;

int main(int argc, char** argv){

 path* eno = malloc(sizeof(path));
 path* second_path = malloc(sizeof(path));

 has_them* all = malloc(sizeof(has_them)); //this list should have all of my allocated path pointers
 all->all_paths = malloc(sizeof(path*)*10);
 all->all_paths[0] = eno; 
 all->all_paths[1] = second_path;

 printf("%p und %p\n", eno, second_path);
 printf("%p und %p\n", all->all_paths[0], all->all_paths[1]);

 all->all_paths[1] = NULL;

 printf("%p und %p\n", eno, second_path);
 printf("%p und %p\n", all->all_paths[0], all->all_paths[1]);

 return (EXIT_SUCCESS);
}
所以我的问题是,在我的方法中,我只有我的all变量,我想使用这个变量来更改我的初始指针(这里是eno和second_path),所以例如,将它们设置为NULL。
但是当我像上面那样做时,第二条路径的初始指针不是空的,而是保持不变的…

在这个设置中,将
eno
第二条路径设置为空的唯一方法是:

    eno = NULL;
    second_path = NULL;

使用
one
及其内部指针进行的任何操作都不能做到这一点,因为
one
不包含有关变量
eno
second\u路径的信息。它只包含
eno
second\u路径
也包含的内容的副本,即两个malloc结构的地址。篡改副本对原件没有影响。

事实上,要使用指针的“all”列表将第二个路径的值设置为NULL,元素“all->all\u path[1]”应为指向第二个路径指针地址的类型(path**)。 变量'all->all_paths'类似于一个表,其元素是指向'path'类型指针的指针。要将second_path的值设置为NULL,可以使用语句“*(all->second_path[1])=NULL”

结构“has_them”的字段“all_path”应为“path***”(三星)类型。应该对代码进行一些更改

以下是代码,它可以编译并正常工作:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int a;

} path;

typedef struct {

path*** all_paths;

} has_them;

int main(int argc, char** argv){

 path* eno = malloc(sizeof(path));
 path* second_path = malloc(sizeof(path));

 has_them* all = malloc(sizeof(has_them)); //this list should have all of my allocated path pointers
 all->all_paths = malloc(sizeof(path**)*10);
 all->all_paths[0] = (path**)&eno;
 all->all_paths[1] = (path**)&second_path;

 printf("%p und %p\n", eno, second_path);
 printf("%p und %p\n", *(all->all_paths[0]), *(all->all_paths[1]));

 //The second element of all->all_paths is nulled here
 *(all->all_paths[1]) = NULL;

 printf("%p und %p\n", eno, second_path);
 printf("%p und %p\n", *(all->all_paths[0]), *(all->all_paths[1]));

 return (EXIT_SUCCESS);
}
#包括
#包括
类型定义结构{
INTA;
}路径;
类型定义结构{
路径***所有路径;
}你有他们;
int main(int argc,字符**argv){
path*eno=malloc(sizeof(path));
path*second_path=malloc(sizeof(path));
has_them*all=malloc(sizeof(has_them));//此列表应包含我分配的所有路径指针
所有->所有路径=malloc(sizeof(路径**)*10);
全部->所有路径[0]=(路径**)和eno;
全部->所有路径[1]=(路径**)和第二路径;
printf(“%p和%p\n”,eno,第二个路径);
printf(“%p和%p\n”,*(全部->所有_路径[0]),*(全部->所有_路径[1]);
//all->all_路径的第二个元素在此为空
*(全部->所有_路径[1])=NULL;
printf(“%p和%p\n”,eno,第二个路径);
printf(“%p和%p\n”,*(全部->所有_路径[0]),*(全部->所有_路径[1]);
返回(退出成功);
}

当您不再需要动态分配的变量时,不要忘记释放它们。

all->all\u path[1]\u path=NULL输入错误?它应该是什么(它应该给出一个错误),是的,你是对的,很抱歉。我刚刚编辑了帖子,所以如果我将path的变量设置为某个值,那么
all->all_path[1]=NULL
也会将second_path设置为NULL???@malajedala我不明白你想做什么。请用更具体的信息更新你的问题。天哪,你是对的,这很有意义。。所以我能记得当我想用其他指针来改变我的初始指针时,我总是需要一个指针维度吗?