我有一个问题我在C中使用struct列表,当我在列表中添加一个Item时,我这样做:
nodo *nuevo=(nodo*) malloc (sizeof(nodo));
char nombre[5]="vd";
nombre[2]=letra;
nombre[3]=indice;
nombre[4]='\0';
nuevo->siguiente = NULL;
nuevo->path= path;
nuevo->nombre= nombre;
这是有效的,但在另一种方法,当我试图获取nombre和路径的值似乎是如果它们是空的(“”) 但是当我通过这种方式设置值时:
nuevo->path= "anyString";
nuevo->nombre= "anyString";
在另一种方法中我可以完美地得到这些值,有什么建议吗? 结构性的节点是这样的:
typedef struct{
char *path;
char *nombre;
particion *part;
struct nodo *siguiente;
}nodo;
当我在列表中保存时,我这样做:
primero=nuevo;
其中primero的类型为nodo *
当我尝试获取值时,我使用:
if(strcmp(aux->nombre,id)==0){
printf("Value is fine");
break;
}
我会赞美任何消极或评论,谢谢大家。 我在debian的Codeblocks中。
答案 0 :(得分:1)
您尚未指定,但似乎char nombre[5]
是本地的,因此在功能堆栈
因此,如果您将其分配给nuevo-> nombre并在另一个函数中使用它会导致未定义的行为,因为stackframe现在指向其他地方
更好的方法是使用nuevo->nombre
将内存分配给malloc
,然后使用strcpy
答案 1 :(得分:0)
malloc足够的空间来存储结构中每个指针的数据,并将字符串复制到分配的指针。
nuevo->path = malloc(strlen(path) + 1);
strcpy(nuevo->path, path);
(等等其他领域)
答案 2 :(得分:0)
在第一种方法中,您将chars指针(nuevo-&gt; path和nuevo-&gt; nombre)分配给char数组地址,因此如果char数组是本地的或它们的值更改,则会影响指针。< / p>
在第二种方法中,编译器将为您的指针分配内存并将值赋给它们,以便您可以在任何函数中检索该值。
要使第一种方法正常工作,您需要将代码更改为以下示例
nuevo->path= (char *)malloc(strlen(path)+1);
strcpy(nuevo->path,path);
nuevo->nombre= (char *)malloc(strlen(nombre)+1);
strcpy(nuevo->nombre,nombre);