gpt4 book ai didi

c - Strcpy 函数更改不相关的共享内存数据

转载 作者:行者123 更新时间:2023-11-30 15:34:05 25 4
gpt4 key购买 nike

我是一名学生,正在开发一个简单的 C 程序,该程序实现两个共享内存段。问题是,当我将 strcpy 函数与指向名为 nptr2 的第二个内存段的指针一起使用时,会更改名为 nptr 的第一个内存段的值。

我一直在阅读另一个问题,这些问题已通过在字符串末尾放置空值来解决,因为正在复制的字符串没有空终止字符。但我希望这不是我的情况,因为我正在使用 fgets。我向您展示了我添加到代码中的一些 printf 的输出,以便更容易地了解发生的情况。

用于 nptr 的结构

struct estadistikak{
int erabiltzaile;
int bbluzera;
int mezukop;
int karakkop;
};

内存段声明和附件

int memid,memid2;
char mezua[50],*nptr2;
struct shmid_ds buff;
struct estadistikak *nptr;

if ((memid=shmget(0x1234L,sizeof(mezua),0600|IPC_CREAT))<0){
perror("shmget error");
exit(-1);
}
printf("%d\n",memid);

if((nptr2=(char*)shmat(memid,0,0))==(char*)-1){
perror("shmat error");
exit(-1);
}

//Estatistiken memoria sortu eta atzitu
if ((memid2=shmget(0x12345L,sizeof(stats),0600|IPC_CREAT))<0){
perror("shmget error");
exit(-1);
}
printf("%d\n",memid);

if((nptr=(struct estadistikak*)shmat(memid,0,0))==(struct estadistikak*)-1){
perror("shmat error");
exit(-1);
}

发生问题的部分

请注意,nptr 和 nptr2 是两个不同的内存指针,它们之间没有关系。

printf("Sartu nahi duzun mezua:\n");
fflush(stdout);
__fpurge(stdin);
fgets(mezua,50,stdin);

printf("Before: %d\n",nptr->erabiltzaile);
strcpy(nptr2,mezua);
printf("After: %d\n",nptr->erabiltzaile);
strcpy(mezua2,nptr2);
printf("Mi mensaje: %s\n",mezua2);

printfs 的输出

Sartu nahi duzun mezua:
asdf
Before: 1
After: 1717859169
Mi mensaje: asdf

感谢您的宝贵时间,并祝您代码愉快!

最佳答案

您两次附加到同一个memid:

if ((memid=shmget(0x1234L,sizeof(mezua),0600|IPC_CREAT))<0){
perror("shmget error");
exit(-1);
}

if((nptr2=(char*)shmat(memid,0,0))==(char*)-1){
perror("shmat error");
exit(-1);
}

//Estatistiken memoria sortu eta atzitu
if ((memid2=shmget(0x12345L,sizeof(stats),0600|IPC_CREAT))<0){
perror("shmget error");
exit(-1);
}
printf("%d\n",memid);

if((nptr=(struct estadistikak*)shmat(memid,0,0))==(struct estadistikak*)-1){
perror("shmat error");
exit(-1);
}

第二个应该是:

if((nptr=(struct estadistikak*)shmat(memid2,0,0))==(struct estadistikak*)-1){
perror("shmat error");
exit(-1);
}

话虽如此,将 nptr2 附加到 memid 并将 nptr 附加到 memid2 似乎很愚蠢>。我会使用一致的后缀:

nptr1    memid1
nptr2 memid2

因此:

if ((memid1 = shmget(0x1234L, sizeof(mezua), 0600|IPC_CREAT)) < 0)
err_exit("shmget 1");

if ((nptr1 = (char*)shmat(memid1, 0, 0)) == (char*)-1)
err_exit("shmat 1");

if ((memid2 = shmget(0x12345L, sizeof(stats), 0600|IPC_CREAT)) < 0)
err_exit("shmget 2");

if ((nptr2 = (struct estadistikak*)shmat(memid2, 0, 0)) == (struct estadistikak*)-1)
err_exit("shmat 2");

并且 err_exit() 可能很简单:

void err_exit(const char *msg)
{
perror(msg);
exit(-1);
}

虽然我通常使用更复杂的变量参数,类似 printf 的函数。

关于c - Strcpy 函数更改不相关的共享内存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23443436/

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