[英]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()
會成功(假設上面的行是編輯錯誤,不應該在那里)。
此外,這是一個運行時錯誤,而不是你說的“編譯錯誤”。
此外,典型的錯誤適用:
malloc()
的返回值 。 這同樣適用於realloc()
。 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.