【问题标题】:Why do I cause a segmentation fault when passing pointers between local processes?为什么在本地进程之间传递指针时会导致分段错误?
【发布时间】:2013-10-23 17:56:50
【问题描述】:

我正在将一组指针从服务器传递到客户端。但是,在客户端,当我取消引用接收到的数组时,会出现分段错误。 服务器和客户端都是操作系统本地的。我认为我在指针方面犯了某种错误并违反了某些指针规则。

代码如下:

Server.c

struct WinGoku goku,windows,gates;

struct WinGoku *array[3];
array[0] = &goku;
array[1] = &windows;
array[2] = &gates;

send(conSocket, array, sizeof(&array), 0);

Client.c

struct WinGoku **array;

int rec =  recv(mySocket, array, 4, 0);

printf("bytes Recieved %d\n", rec);

int i;
for(i = 0; i<3;i++)
{
    printf("%s\n",array[i]->test);
}

struct WinGoku 仅包含char[50],我在其中使用strcpy 复制数据。

发送和接收没有返回-1,因此数据可以正确发送和接收。

我做错了什么?

【问题讨论】:

  • 我在大量构建数组时会出现段错误,这通常是因为意外超出范围,所以我的第一站是检查以确保我从不询问实际不存在的信息。您应该为此查看所有代码,因为它有时会出现在奇怪的地方。
  • @JonahNelson 除了在这种情况下,问题出在哪里是完全显而易见的。

标签: c pointers network-programming segmentation-fault


【解决方案1】:

服务器和客户端都是操作系统本地的。我确信我在指针方面犯了某种错误并违反了一些指针规则。

指针位于"virtual memory" space 中。范围仅限于单个进程。

每个服务器,客户端,尽管在同一台计算机上,都有自己的虚拟内存空间。这些指针在每个中都是无效的。您必须serialize(通常是编组)内存内容才能通过网络发送。

【讨论】:

  • 优秀的解释者布赖恩。
  • 是的,我完全忘记/忽略了每个进程都有自己的内存的概念。谢谢你提醒我:)
  • 没有例外,没有规则。如果一个进程是通过 fork 另一个进程创建的,并且对象是在 fork 之前创建的并且仍然存在于两个进程中,那么传输指针应该可以工作。
【解决方案2】:

您不能通过网络发送指针。嗯,从技术上讲,您可以,但他们不会在接收系统上指向同一个东西。

如果实际对象很简单,即不包含指针,那么您可以直接发送它们。

【讨论】:

  • 好吧,我从服务器传递了一个结构 obj 的地址并在客户端收到。像魅力一样工作,为什么这不起作用?
  • @UmerFarooq 是的,您可以发送指针,但就像我在更新的答案中所说的那样,它不会指向其他程序中的相同内容。
  • @UmerFarooq 保存指向文件的指针,然后再读取它们是一样的,它根本不会指向您分配的任何内容。
  • 你会得到只在发送机有效的内存地址。
  • @Tarik "服务器和客户端都是操作系统本地的。"这不是一台不同的机器。这是一个不同的过程。
【解决方案3】:

sizeof(&array) 不是 struct WinGoku * 3 的大小

应该是(3*sizeof(WinGoku))

编辑:

一个进程的指针不能在另一个进程中访问。 你应该在服务器和客户端之间发送整个。

【讨论】:

  • 他应该将他的结构序列化为一个字节数组
  • 这就像在谈论被炸毁的建筑物的油漆有多糟糕。
猜你喜欢
  • 2013-10-18
  • 2014-10-15
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2014-01-10
  • 2020-12-17
相关资源
最近更新 更多