在方法调用中更改指针值时出现 C++ 分段错误

C++ Segmentation fault when changing value of pointer within method call

我正在使用共享 utils.cpp.

编写服务器-客户端应用程序

因此服务器和客户端使用(在utils.h中)预定义的方法:

int listening_socket(int port);
int connect_socket(const char *hostname, const int port);
int accept_connection(int sockfd);
int recv_msg(int sockfd, int32_t *operation_type, int64_t *argument);
int send_msg(int sockfd, int32_t *operation_type, int64_t *argument);

到目前为止,还不错。

但是由于 recv_msg() 只是 returns 如果它成功与否,我需要通过指针修改来处理传输的 operation_type 和参数。在这一点上我有点迷茫。

我的目标是将方法参数(int32_t *operation_type 和 int64_t *参数指针)设置为传输值。在 server.cpp 中,我初始化了 int32_t * 和 int64_t * 以便将它们传递给 recv_msg() 方法(也试图给它们一个值,例如 = 0) .

server.cpp:

...
int32_t *operation_type; // with = 0; also Segmentation fault
int64_t *operation_type; // with = 0; also Segmentation fault

if (recv_msg(server_socket, operation_type, argument) == 0)
        printf("In server.cpp: operation_type: %" PRId32 " and argument: %" PRId64 " \n", operation_type, argument);

在 utils.cpp 中,我尝试通过以下方式更改指针值的方法:

int recv_msg(int sockfd, int32_t *operation_type, int64_t *argument) {
   // some buffer and read() stuff...
   // trying to change pointer's value 
   operation_type = (int32_t *)1;
   // also tried 
   *operation_type = 1;
   // and same thing with the int64_t * argument pointer
   int64_t  argu = message.argument(); // also tried this
    *argument = argu;

    printf("In utils.cpp: operation_type: %" PRId32 " and argument: %" PRId64" \n", operation_type, argument);

Ether 我不改变点值,所以在方法中它们有想要的值,但是在执行 recv_msg() 之后点值再次为 0 或者我得到一个 分段错误.

我了解指针和引用的基础知识,但我习惯了 Java 并且不熟悉“*”和“&”前缀。

我的问题:如何修改在导入方法中作为参数传递的指针,或者我准备好 int32_t 和 int64_t wring?

指针是应该用来指向一些已分配内存的变量。

在您的初始化中,您将指针指向 NULL,即没有内存。

然后你试图改变什么都没有的价值。这就是您遇到分段错误的原因。

您应该:

声明一些局部变量并使您的指针指向它们。类似于:

int32_t local_type_operation;
type_operation = &local_type_operation;

或者使用一些动态内存分配函数分配一些内存指向(搜索malloc)。

谢谢大家!我终于明白了它并使它起作用!

推荐视频:https://www.youtube.com/watch?v=7HmCb343xR8

还有我试验过的虚拟代码:

#include <stdio.h>
#include <stdlib.h>

int changePointer(int32_t *type, int64_t *argu);

int main(int args, char *argv[])
{
    int32_t type = -1; // declare local varibales
    int64_t argu = -1; 

    printf("\nPre-ChangePointer:\n   type: %d at %d\n   argu: %lld at %d\n\n",
           type, &type, (long long)argu, &argu); // Debug print

    changePointer(&type, &argu); // call mathod to change pointers value

    printf("\nPost-ChangePointer:\n   type: %d at %d\n   argu: %lld at %d\n\n",
           type, &type, (long long)argu, &argu); // Debug print

    return 0;
}

int changePointer(int32_t *ptr, int64_t *ptr2) // ptr and ptr2 are copies of type_ptr and argu_ptr
{
    *ptr = 2;  // change value of type_ptr
    *ptr2 = 2; // change value of argu_ptr

    return 1;
}