两个字符*的memcpy()期间的c-segfault



我有以下内容:

//MTU = 1472  |  numBytes = 5000
/*char* data = 
#################################################
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#################################################
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#################################################
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/
char* payload = NULL;
size_t packetSize;
(numBytes > MTU) ? packetSize = MTU : packetSize = numBytes;
memcpy(payload, data, packetSize);

每当我尝试执行memcpy将第一个1472字节从data复制到payload时,我都会得到一个segfault——有什么提示吗?

您永远不会初始化payload:

char* payload = NULL; // payload null
size_t packetSize;
(numBytes > MTU) ? packetSize = MTU : packetSize = numBytes;
memcpy(payload, data, packetSize); // copy data to null address ... segfault

相反,您需要mallocnew:

char* payload = new char[packetSize];

char* payload = (char*)malloc(packetSize);

不要忘记delete[]/free

payloadNULL,所以如果您尝试对其进行memcpy,则会导致未定义的行为。您认为这些字节要去哪里?

你必须分配空间来写它。例如:

payload = malloc(packetSize);
if ( !payload ) 
    { exit(EXIT_FAILURE); /* error handling */ }
memcpy(payload, data, packetSize);
// ...use payload...
free(payload);

此外,您应该检查data中的数据是否与packetSize中的数据一样多。如果您编写char const data[] = ".....";,则可以使用sizeof data - 1对此进行检查。

因为您正试图将内容复制到空指针。这不是缓冲区的有效位置。

最新更新