两个char *的memcpy()期间的段错误

时间:2014-04-25 04:45:19

标签: c memcpy

我有以下内容:

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

memcpy(payload, data, packetSize);

每当我尝试memcpy1472字节从data复制到payload时,我会得到一个段错误 - 任何暗示原因?

3 个答案:

答案 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

相反,您需要mallocnew

char* payload = new char[packetSize];

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

...不要忘记delete[] / free

答案 1 :(得分:3)

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进行检查。

答案 2 :(得分:2)

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