gpt4 book ai didi

c - 在 C 中启动并初始化新的 char 数组后变量发生更改

转载 作者:行者123 更新时间:2023-11-30 17:01:30 24 4
gpt4 key购买 nike

  • 当程序在 char filePath[100]="/home/wind/software/eclipse/eclipse2/server_multiaccess/wrPro3" 运行时,我发现用于通信的子套接字的套接字编号已更改突然。我想知道为什么?
  • 结果如图: The result using watch in gdb

  • sockM 是一个结构体列表的头部,是我自己定义的。我尝试将子结构放在结构列表中。

<小时/>
struct Sock{
int socket;
short int ifMain;
short int status;
FILE* fp; // Cannot be initialized here
long int filePoint;
char recvBuf[BUFSZ];
char sendBuf[BUFSZ];
char command[BUFSZ];
unsigned long int answer;
};
struct sockListEle{
struct Sock sock;
struct sockListEle* last;
struct sockListEle* next;
struct sockListEle* head;
struct sockListEle* end;
int sockNum;
};

int main(void) {
int mainS,childS;
struct sockaddr_in mainSock;
int on;
.....
.....
while(1){
FD_SET(mainS,&mainRead);
select(mainS+1,&mainRead,NULL,NULL,&timeout);
if(FD_ISSET(mainS,&mainRead)){
struct sockaddr_in childSock;
.....
struct sockListEle sockC;

sockC.sock.ifMain=0;
......
sockC.next = NULL;

sockM.end = &sockC;
sockM.sockNum++;
sockC.last->next = &sockC;

maxfdp = maxfdp > childS ? maxfdp:childS+1;
}
.....
.....
if(maxfdp > 0){
.....
temp = &sockM;
do{
temp = temp->next;
switch(temp->sock.status){
....
case LOOKFOR:
if(FD_ISSET(temp->sock.socket,&writeList)){
send(temp->sock.socket, temp->sock.sendBuf, BUFSZ, 0);
if(!strcmp(temp->sock.command+4, "ls")){
char filePath[100] =
"/home/wind/software/eclipse/"
"eclipse2/server_multiaccess/wrPro3";
......
}
break;
......
}
}while(temp->next != NULL)
}
return EXIT_SUCCESS;
}

最佳答案

问题是这三行:

struct sockListEle sockC;
sockM.end = &sockC;
sockC.last->next = &sockC;

它们三个都可以在同一个 while、同一个 if 内找到。所以: sockC 位于堆栈上并在每个循环中重用,因此列表中的所有元素始终指向同一个 sockC 。如果您修改它(可能通过调用accept),您将修改所有列表元素的唯一可见实例。

相反,您需要为每个套接字分配单独的内存:

struct sockListEle* sockC = (struct sockListEle*) malloc(sizeof(struct sockListEle));

并直接分配指针(不使用地址运算符 &)。不要忘记在不再需要内存时立即释放内存,否则会出现内存泄漏。

关于c - 在 C 中启动并初始化新的 char 数组后变量发生更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003708/

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