gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:32 25 4
gpt4 key购买 nike

我有这个结构

typedef struct InfoSession {
TabNodePtr FirstTab;
TabNodePtr LastTab;
TabNodePtr CurrTab;
TabNodePtr AuxTab;
char *OpeningAddress;
} InfoSession;

它必须是一个控制其所有选项卡的浏览器 session 。 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;
}

一切正常,我添加的新开户地址显示正确。但是,当我同时有两个 session 时,更改第二个 session 的 OpeningAddress 也会更改第一个 session 的 OpeningAddress (添加第二个 session 时,在我在第一个 session 中插入了一个新的 OpeningAddress,第二个 session 的 OpeningAddress 与第一个 session 不同)。

例如,如果我将第一个 session 的开始地址更改为 "AA",则在这之后添加一个新 session 会使第二个 session 的 OpeningAddress 成为NULL,而不是 "AA"(这是我想要的)。

添加新 session :

            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);

此外,更改要管理的 session 的代码:

            printf("\nPress 1 to manage first Session or 2 to manage second Session:\n");
scanf("%d", &n);
getchar();
if (n == 1){
CurrSession = MySession1;
printf("\nManaging first Session\n");
} else if (n == 2){
CurrSession = MySession2;
printf("\nManaging second Session\n");
}

感谢您的帮助。

最佳答案

问题很简单:

  • 调用 SessionNewOpeningAddress(CurrSession, OpeningAddress);CurrSessionOpeningAddress 成员设置为指向调用者范围内的数组在此调用后被覆盖。事实上,所有 OpeningAddress 字段都可能指向调用函数中的同一个数组。
  • 像您一样发布代码片段没有帮助,缺少大部分上下文,一些其他代码可能会导致问题。
  • TabNodePtr 那样将指针隐藏在 typedef 后面是非常不鼓励的。它会导致初学者和高级程序员都感到困惑。

要解决您的问题,您可以复制该字符串:

#include <string.h>

void SessionNewOpeningAddress(InfoSessionPtr Session, char *OpeningAddress1) {
Session->OpeningAddress = OpeningAddress1 ? strdup(OpeningAddress1) : NULL;
}

只要结构已正确初始化,您就需要释放先前的值,并且在丢弃结构时还需要释放当前的 Session->OpeningAddress

关于c - 在结构中重新排列指针不会给我正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55924994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com