我有这个struct
typedef struct InfoSession {
TabNodePtr FirstTab;
TabNodePtr LastTab;
TabNodePtr CurrTab;
TabNodePtr AuxTab;
char *OpeningAddress;
} InfoSession;
必须是控制其所有选项卡的浏览器会话。打开新标签页时,OpeningAddress
是默认地址。
我的main
如下:
int main() {
InfoSessionPtr MySession1 = NULL, MySession2 = NULL, CurrSession = NULL;
int option, flag, n;
char *OpeningAddress == NULL;
...
}
当我想使用此功能更改OpeningAddres
时:
void SessionNewOpeningAddress(InfoSessionPtr Session, char *OpeningAddress1) {
Session->OpeningAddress = OpeningAddress1;
}
一切正常,我添加的新开业地址正确显示。但是,当我同时有两个会话时,更改第二个会话的OpeningAddress
也会更改第一个会话的OpeningAddress
(添加第二个会话时,在插入新的{ {1}}到第一个会话,第二个会话的OpeningAddress
与第一个会话不同。
例如,如果我将第一个会话的开始地址更改为OpeningAddress
,则在此之后添加一个新会话,使第二个会话的"AA"
为OpeningAddress
,而不是NULL
(我想要的是)。
添加新的会话:
"AA"
更改开幕地址:
if (MySession1 == NULL && MySession2 == NULL) {
MySession1 = SessionNew(OpeningAddress);
CurrSession = MySession1;
printf("\nNew Session (first) created!\n");
printf("First Session assigned as 'Current' Session\n");
} else {
MySession2 = SessionNew(OpeningAddress);
CurrSession = MySession2;
printf("\nA Session already exists, created a second one.\n");
printf("Second Session assigned as 'Current' Session\n");
}
此外,代码更改了要管理的会话:
printf("\nInsert the new Opening Address:\n");
scanf("%s", OpeningAddress);
SessionNewOpeningAddress(CurrSession, OpeningAddress);
感谢您的帮助。
答案 0 :(得分:1)
问题很简单:
SessionNewOpeningAddress(CurrSession, OpeningAddress);
将OpeningAddress
的{{1}}成员设置为指向调用者作用域中的一个数组,该数组在此调用后将被覆盖。实际上,所有CurrSession
字段都可以指向调用函数中的同一数组。OpeningAddress
那样将指针隐藏在typedef后面。对于初学者和高级程序员而言,这都会导致代码混乱。
要解决您的问题,您可以复制字符串:
TabNodePtr
只要结构已正确初始化,您就需要释放先前的值,并且在丢弃结构时也要释放当前的#include <string.h>
void SessionNewOpeningAddress(InfoSessionPtr Session, char *OpeningAddress1) {
Session->OpeningAddress = OpeningAddress1 ? strdup(OpeningAddress1) : NULL;
}
。