gpt4 book ai didi

c - 写入共享内存段错误

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

我想做的只是将“嘿”写入我的共享内存,但它被抛出到该行。非常简单的代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
#define FLAGS IPC_CREAT | 0644
int main(){
key_t key;
int shmid;
if ((key = ftok("ex31.c", 'k')) == -1){
exit(1);}
if ((shmid = shmget(key, SHM_SIZE, FLAGS)) == -1) {
exit(1);}
char* shmaddr;
if( shmaddr=shmat(shmid,0,0) == (char*)-1){ //WRONG ARGUMENTS ??
exit(0); }
printf("opened shared memory\n"); //gets here
strcpy(shmaddr, "hey"); //GETS THROWN HERE
printf("after writing to memory\n"); //never get here

调试器给我的错误是:

Program received signal SIGSEGV, Segmentation fault. 0x0000000000401966 in main (argc=1, argv=0x7fffffffe068) at ../ex31.c:449 449 strcpy(shmaddr, "hey"); //GETS THROWN HERE

最佳答案

问题在于运算符优先级。在行中

shmaddr=shmat(shmid,0,0) == (char*)-1)

然后,一元 - 运算符和强制转换运算符的优先级最高,其次是 ==,最后是具有最低优先级的 =优先。所以你的代码结果等于

shmaddr=(shmat(shmid,0,0) == (char*)-1))

这是无稽之谈。

条件内部赋值是非常糟糕的编程习惯。如果你尝试的话,每个半像样的编译器都会给你一个警告。除了运算符优先级问题之外,= 和 == 很容易混淆。此外,= 运算符会给表达式带来副作用,因此将其与其他运算符混合可能会导致未定义的行为。也许最重要的是,将 = 放在条件内通常会大大降低代码的可读性。

你的代码应该写成:

shmaddr = shmat(shmid,0,0);
if(chmaddr == (char*)-1){

重要的是要明白,通过将这 2 行合并为 1 行,您不会获得任何好处。除了上述版本中没有错误之外,生成的机器代码将是相同的。

关于c - 写入共享内存段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37159509/

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