我在遇到问题:novo->conta.nome_cliente = valor2;
。在这种动态堆栈结构中。 Empilhar
是将新元素压入堆栈的功能。为什么我不能为堆栈内部的结构分配新值?
struct conta_de_luz
{
int cod_cliente;
char nome_cliente[40];
};
typedef struct Item {
struct conta_de_luz conta;
struct Item *anterior;
} Elemento;
void Inicializar(Elemento **topo) {
*topo = NULL;
}
int EstaVazia(Elemento **topo) {
if(*topo == NULL)
return VERD;
else
return FALSO;
}
void Empilhar(Elemento **topo, int valor, char valor2) {
Elemento *novo;
novo = (Elemento *) malloc(sizeof(Elemento));
novo->conta.cod_cliente = valor;
novo->conta.nome_cliente = valor2;
novo->anterior = *topo;
*topo = novo;
}
答案 0 :(得分:0)
问题在于,行novo->conta.nome_cliente = valor2;
将char
分配给定义为char nome_cliente[40];
的字符串。
因此,您的功能可能应该是void Empilhar(Elemento **topo, int valor, char* valor2)
。但这仍将假设valor2
的值在topo
的生存期内一直保留在内存中。
最好是void Empilhar(Elemento **topo, int valor, const char* valor2)
,然后再使用strcpy(novo->conta.nome_cliente, valor2);
。
但这假设valor2
包括其NULL终止符的长度始终在40个字符之内。如果不能保证此假设,则最好使用strdup()
复制字符串。然后,您还需要在清理函数中单独free()
。