我有以下内容:
//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
相反,您需要malloc
或new
:
char* payload = new char[packetSize];
或
char* payload = (char*)malloc(packetSize);
不要忘记delete[]
/free
payload
是NULL
,所以如果您尝试对其进行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
对此进行检查。
因为您正试图将内容复制到空指针。这不是缓冲区的有效位置。