在方法调用中更改指针值时出现 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;
}
我正在使用共享 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;
}