簡體   English   中英

在C中重新分配內存時編譯中斷

[英]compilation break when reallocating the memory in C

我正在嘗試一個例子

int main(){
    int count = 5;
    char *a = "JOSUA";
    char *c = "JANETALAE";
    char *b = NULL;
    char *d = NULL;
    b = (char *)malloc(sizeof(char)*5);
    b = a;
    if(b == NULL){
        printf("\n malloc failed");
    }
    printf("\nChar is:%s\n",b);
    d = (char *)realloc(b,sizeof(char) * 9);
    if(d == NULL){
        printf("\n realloc failed");
    }
    else{
        b = d;
        b = c;                                                                                                                                                                             
    }
    printf("\nChar is:%s\n",b);
    return 0;
}

我正在嘗試一個示例程序來分配和重新分配內存。 但我無法重新分配內存並獲得如下編譯中斷。

Char is:JOSUA
*** glibc detected *** ./realloc: realloc(): invalid pointer: 0x080485b4 ***
======= Backtrace: ========= /lib/libc.so.6[0x88ffd1] /lib/libc.so.6(realloc+0x2cf)[0x89613f] /lib/libc.so.6(realloc+0x2e7)[0x896157] ./realloc[0x80484aa] /lib/libc.so.6(__libc_start_main+0xe6)[0x836e16] ./realloc[0x8048391]
======= Memory map: ======== 007fc000-0081c000 r-xp 00000000 fd:00 659977     /lib/ld-2.12.90.so 0081c000-0081d000 r--p 0001f000 fd:00 659977     /lib/ld-2.12.90.so 0081d000-0081e000 rw-p 00020000 fd:00 659977     /lib/ld-2.12.90.so 00820000-009ad000 r-xp 00000000 fd:00 660018     /lib/libc-2.12.90.so 009ad000-009af000 r--p 0018c000 fd:00 660018     /lib/libc-2.12.90.so 009af000-009b0000 rw-p 0018e000 fd:00 660018     /lib/libc-2.12.90.so 009b0000-009b3000 rw-p 00000000 00:00 0  00a29000-00a45000 r-xp 00000000 fd:00 660039     /lib/libgcc_s-4.5.1-20100924.so.1 00a45000-00a46000 rw-p 0001b000 fd:00 660039     /lib/libgcc_s-4.5.1-20100924.so.1 00a84000-00a85000 r-xp 00000000 00:00 0          [vdso] 08048000-08049000 r-xp 00000000 fd:02 9440701    /home/user/beata/c_samples/realloc 08049000-0804a000 rw-p 00000000 fd:02 9440701    /home/user/beata/c_samples/realloc 092ac000-092cd000 rw-p 00000000 00:00 0          [heap] b78bc000-b78bd000 rw-p 00000000 00:00 0  b78d3000-b78d5000 rw-p 00000000 00:00 0  bfbd8000-bfbf9000 rw-p 00000000 00:00 0          [stack] Aborted (core dumped)

無法理解編譯中斷的原因。

你不能在靜態內存變量上使用realloc(實際上是a):

b = (char *)malloc(sizeof(char)*5);
b = a;

也許更換:

b=a;

有:

strcpy(b,a);

會讓你朝着正確的方向前進 我想也許你認為那是什么b=a; 實際上在做什么?

但要確保你已經在堆上分配了足夠的內存,即不要忘記字符串末尾隱含的'\\ 0',例如

b = (char *)malloc(sizeof(char)*5);

應該:

b = malloc(6);

如果你想在其中裝上"JOSUA""JOSUA"實際上是"JOSUA\\0"

您正在將無效指針傳遞給realloc() ,就像錯誤所說的那樣。

它是從這一行:

b = a;

在其中用字符串文字的地址覆蓋malloc()的返回值。 你不能將它傳遞給realloc()

你在這個程序中的整體邏輯非常破碎; 如果malloc()失敗,沒有理由相信realloc()會成功(假設上面的行是編輯錯誤,不應該在那里)。

此外,這是一個運行時錯誤,而不是你說的“編譯錯誤”。

此外,典型的錯誤適用:

  1. 在C中, 不要malloc()的返回值 這同樣適用於realloc()
  2. 不要使用sizeof (char) ,這只是一個非常麻煩的寫1的方法。
 b = (char *)malloc(sizeof(char)*5);
 b = a;

那里你剛丟失了malloc返回的地址。

如果傳遞任何其他地址導致未定義的行為 ,那么您需要將malloc返回的地址傳遞給realloc ,這就是您的代碼所做的事情。

您嘗試重新分配尚未malloc的內存:

  9     b = (char *)malloc(sizeof(char)*5);
 10     b = a;

你的第9行在10日被渲染為無用,而malloc返回的地址丟失了。 另外, 不要強制轉換malloc,因為這可以隱藏其他錯誤。

這是一行:

10     b = a;

在這里,您將指針b設置為存儲在指針a中的地址。 所以b現在指向字符串“JOSHUA”。

當你嘗試重新分配b時,你正在向它提供那個最初沒有被malloc分配的地址。 你想要做的是將字符串從a復制到b:

strcpy(b,a);

但是,您需要增加b指向的內存大小。

問題是 b =(char *)malloc(sizeof(char)* 5); 然后立即通過指定a指向的基址來更改指向b的地址。 b = a; / *這是錯誤* / 對於重新分配,您必須傳遞malloc返回的地址,而不是指向的基址。

暫無
暫無

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

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