簡體   English   中英

使用 realloc 連接字符串

[英]Using realloc to concat strings

我試圖連接兩個字符串,假設“dest”字符串沒有足夠的空間來添加另一個字符串,所以我使用動態數組來解決它。

問題是嘗試編譯代碼時出現mremap_chunk錯誤。

我不知道我錯過了什么,因為 realloc 調用包含了所有正確的參數。


錯誤:

malloc.c:2869: mremap_chunk: Assertion `((size + offset) & (GLRO (dl_pagesize) - 1)) == 0' failed. 
Aborted (core dumped)

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

char *strcatt(char *s1, char *s2)
{
    int a = strlen(s1);
    int b = strlen(s2);
    int i, size_ab = a+b;

    s1 = (char *) realloc (s1, size_ab*sizeof(char));

    for(i=0; i<b; i++) {
        s1[i+a]=s2[i];
    }

    s1[size_ab]='\0';

    return s1;
}


int main()
{
    char s1[]="12345";
    char s2[]="qwerty";

    strcatt(s1,s2);
    printf("%s\n", s1);

    return 0;
}

首先,您將非堆內存視為堆內存,不要這樣做。

其次,您沒有在計算中包含終止符的空間。

這里還有一些要點:

  1. 不要命名以str開頭的函數,這是一個保留的命名空間。
  2. 緩沖區大小應該是size_t ,而不是int
  3. 不要在 C 中轉換malloc()的返回值
  4. 當您知道大小時,使用memcpy()復制內存塊。
  5. “右手邊”字符串應該是const
  6. 處理分配錯誤的可能性。
  7. 我認為按sizeof (char)縮放是不好的做法,它總是 1。

下面是我將如何編寫它,假設相同的邏輯:

char * my_strcatt(char *s1, const char *s2)
{
    const size_t a = strlen(s1);
    const size_t b = strlen(s2);
    const size_t size_ab = a + b + 1;

    s1 = realloc(s1, size_ab);

    memcpy(s1 + a, s2, b + 1);

    return s1;
}

你不能reallocfree不與呼叫分配到內存malloc或不是NULL

來自第7.22.3.5 C11 草案中的 realloc 函數

realloc函數釋放ptr指向的舊對象,並返回一個指向size由 size 指定的新對象的指針。 新對象的內容應與解除分配前的舊對象的內容相同,直至新舊大小中較小的一個。 新對象中超出舊對象大小的任何字節都具有不確定的值。

所以, s1 = (char *) realloc (s1, size_ab*sizeof(char)); 您的輸入(自動數組)顯然是錯誤的,永遠不要這樣做。

然后還有更多問題可以在調試器的幫助下修復。

clang調試器給出了非常明確的錯誤描述:

malloc:  error for object 0x7fff6fbb16d6: pointer being realloc'd was not allocated
 set a breakpoint in malloc_error_break to debug

你的兩個數組都被初始化為字符串文字。 此外,您的函數嘗試通過重新分配來修改字符串文字,這在 C 標准中是錯誤的,因為您無法重新分配尚未分配的內容,然后將第二個字符串文字的成員復制到您的“對象”旨在通過在字符串文字上濫用realloc()進行修改。

如果您動態定義了第三個字符串,您將在其中對兩者的內容求和,則該代碼將起作用:

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

char *mystrcatt(char *s1, char *s2)
{
    int a = strlen(s1);
    int b = strlen(s2);
    int i, size_ab = a+b;

    char *s3 = malloc (size_ab*sizeof(char)); //sizeof(char) is always 1

    for(i=0; i<a; i++) { //inefficient
        (s3[i])=s1[i];
    }    

    for(i=0; i<b; i++) { //inefficient
        (s3[i+a])=s2[i];
    }

    s3[size_ab]='\0';

    return s3;
}


int main()
{
    char s1[]="12345";
    char s2[]="qwerty";
    char *s3 = mystrcatt(s1,s2);    
    printf("%s\n", s3);
    free(s3);
    return 0;
}

請注意, 不要在 C 中轉換malloc()的返回值。

暫無
暫無

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

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