memcpy第三个参数大于第二个参数的实际大小

时间:2016-04-20 20:09:27

标签: memcpy

以下是问题代码:

#include <Adafruit_FONA.h>
#include <SoftwareSerial.h>

#define RX_FROM_FONA 2
#define TX_TO_FONA 3
#define FONA_RST 4
#define FONA_PWR_KEY 5
#define FONA_PWR_STATUS 7

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

SoftwareSerial fonaSerial = SoftwareSerial(TX_TO_FONA, RX_FROM_FONA);

void setup() {
    pinMode(FONA_RST, OUTPUT);
    pinMode(FONA_PWR_KEY, OUTPUT);
    pinMode(FONA_PWR_STATUS, INPUT_PULLUP);

    pinMode(LED_BUILTIN, OUTPUT);

    digitalWrite(FONA_RST, HIGH);
    digitalWrite(FONA_PWR_KEY, HIGH);

    resetFona();

    Serial.begin(115200);

    fonaSerial.begin(4800); 
}

void resetFona() {
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(FONA_RST, LOW);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(FONA_RST, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(FONA_PWR_KEY, LOW);
    delay(5000);
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(FONA_PWR_KEY, HIGH);
    delay(100);
}

char buffer[255];
int crIndex = 0;
int bufferIndex = 0;
int foundCR = 0;

void loop() {

    if (Serial.available()) { 
        buffer[bufferIndex++] = Serial.read(); 
        if (buffer[bufferIndex - 1] == 13) { 
            crIndex = bufferIndex - 1;
            foundCR = 1; 
        }
    }

    if (bufferIndex > 255) { bufferIndex = 0; }

    while (fonaSerial.available()) { Serial.write(fonaSerial.read()); }

    if (foundCR > 0) {
        for (int i = 0; i <= crIndex; i++) {
            fonaSerial.write(buffer[i]);
        }

        foundCR = 0;
        bufferIndex = 0;
        crIndex = 0;
    }
}

当我编译它似乎没问题。

int* m_A = new int[4] int* reAlloc = new int[10]; memcpy(reAlloc, m_A, 10 *sizeof(int)); 的第三个参数大于的大小是否可以 memcpy的第二个论点?

1 个答案:

答案 0 :(得分:0)

好的。您的代码无法确保m_A指向距离10 * sizeof(int)至少reAlloc的内存位置,因此这些区域可能会重叠。这意味着您的代码会导致未定义的行为

即使您尝试使用memmove()修复它,您仍然处于灰色区域,因为您不知道*(m_A + 9)处的内容。

可能是您的数据,然后它会起作用(使用memmove(),因为它仍然可能是reAlloc的数据)。可能不是你的数据,在这种情况下你会得到一些SIGSEGV。

memcpy()memmove()是低级内存操作函数,编译器会期望您知道自己在做什么,并且不会发出警告。