簡體   English   中英

如何用memcpy復制?

[英]How to copy with memcpy?

char *concat(char *num1, const char *num2, int index) {

    int length1 = strlen(num1);
    int length2 = strlen(num2); 
    int lengthNum = 0;                   
    char *num = malloc(length1 + length2 + 1);

    if (num == NULL) {
        free(num);
        return NULL;
    }
    // memcpy(num, num1, length1);
    // memcpy(num + length1, num + index, length2 + 1);    

    for (int i = 0; i < length1; i++) {
        num[lengthNum] = num1[i];
        lengthNum++;
    }
    for (int i = index; i < length2; i++) {
        num[lengthNum] = num2[i];
        lengthNum++;
    }
    return num;
}

我嘗試使用memcpy ,但我的程序無法正常工作(復制錯誤,但valgrind未顯示錯誤)。

但是當我改用兩個for循環時,它可以正常工作,但是valgrind顯示錯誤

未初始化的值是由堆分配創建的。

在這種情況下如何正確使用memcpy

memcpy(num, num1, length1);
memcpy(num + length1, num2, length2 + 1); 

您的程序有多個問題:

  • malloc失敗時釋放 null 指針是無用的(但無害)。
  • 您分配length1 + length2 + 1個字節,這很可能太大,因為您打算從第二個字符串中的index復制。
  • 您應該使用類型size_t作為長度和偏移量。
  • 您從num2 + index復制而不檢查index是否是字符串num2內的有效偏移量。
  • 您應該在新字符串的末尾設置一個 null 終止符。

這是修改后的版本:

#include <stdlib.h>
#include <string.h>

char *concat(const char *num1, const char *num2, size_t index) {
    size_t length1 = strlen(num1);

    /* skip index bytes in num2 */
    while (index --> 0 && *num2)
        num2++;

    size_t length2 = strlen(num2);
    char *num = malloc(length1 + length2 + 1);

    if (num != NULL) {
        size_t j = 0;

        while (*num1) {
            num[j++] = *num1++;
        }
        while (*num2) {
            num[j++] = *num2++;
        }
        num[j] = '\0';
    }
    return num;
}

並使用memcpy

#include <stdlib.h>
#include <string.h>

char *concat(const char *num1, const char *num2, size_t index) {
    size_t length1 = strlen(num1);
    /* skip index bytes in num2 */
    while (index --> 0 && *num2)
        num2++;
    size_t length2 = strlen(num2);
    char *num = malloc(length1 + length2 + 1);
    if (num != NULL) {
        memcpy(num, num1, length1);
        memcpy(num + length1, num2, length2 + 1);    
    }
    return num;
}

concat返回指向分配數組的指針。 調用者有責任在使用后釋放此 object。 例如:

#include <stdio.h>

int main() {
    char *p = concat("Hello", "dear world", 4);
    if (p != NULL) {
        printf("%s\n", p);
        free(p);
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM