我有以下内容:
//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
时,我会得到一个段错误 - 任何暗示原因?
答案 0 :(得分:4)
您永远不会初始化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
答案 1 :(得分:3)
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
进行检查。
答案 2 :(得分:2)
因为您正在尝试将内容复制到空指针。那不是缓冲区的有效位置。