在结构中重新排列指针不能给我正确的结果

时间:2019-04-30 16:13:09

标签: c

我有这个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);

感谢您的帮助。

1 个答案:

答案 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; }