1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int *p_old,*p_new,i; 7 8 p_old = (int *)malloc(2 * sizeof(int)); 9 *p_old = 1; 10 *(p_old + 1) = 2; 11 p_new = (int *)realloc(p_old,3 * sizeof(int)); 12 *(p_old + 2) = 3; 13 14 for(i = 0; i < 3; ++i) 15 printf("%d ",*(p_new + i)); 16 putchar('\n'); 17 18 for(i = 0; i < 3; ++i) 19 printf("%d ",*(p_old + i));//point to the same memory area 20 putchar('\n'); 21 22 for(i = 0; i < 3; ++i) 23 printf("%d ",p_old[i]);//as above 24 //free(p_old); 此处不需要释放 p_old,因为 realloc() 已经释放过了 25 free(p_new); 26 27 return 0; 28 }
结果:
1 2 3
1 2 3
1 2 3
realloc() should only be used for dynamically allocated memory. If the memory is not dynamically allocated, then behavior is undefined. https://www.geeksforgeeks.org/g-fact-66/
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int arr[2] = {1,2}; 7 int *p_old,*p_new; 8 9 for(int i = 0;i < 2; ++i) 10 printf("%d ",arr[i]); 11 p_old = arr; 12 p_new = (int *)realloc(p_old,3 * sizeof(int)); 13 arr[2] = 3; 14 for(int i = 0;i < 3; ++i) 15 printf("%d ",arr[i]); 16 free(p_old); 17 free(p_new); 18 19 return 0; 20 }
编译运行:
1 2
GDB 调试:
(gdb) l
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(void)
5 {
6 int arr[2] = {1,2};
7 int *p_old,*p_new;
8
9 for(int i = 0;i < 2; ++i)
10 printf("%d ",arr[i]);
(gdb)
11 p_old = arr;
12 p_new = (int *)realloc(p_old,3 * sizeof(int));
13 arr[2] = 3;
14 for(int i = 0;i < 3; ++i)
15 printf("%d ",arr[i]);
16 free(p_old);
17 free(p_new);
18
19 return 0;
20 }
(gdb)
Line number 21 out of range; err_realloc.c has 20 lines.
(gdb) b 11
Breakpoint 1 at 0x4015f5: file err_realloc.c, line 11.
(gdb) r
Starting program: C:\Users\luwudang\c\err.exe
[New Thread 6188.0x1254]
[New Thread 6188.0x3e4]
1 2
Breakpoint 1, main () at err_realloc.c:11
11 p_old = arr;
(gdb) p p_old
$1 = (int *) 0x0
(gdb) p arr
$2 = {1, 2}
(gdb) p &arr[0]
$3 = (int *) 0x22fe30
(gdb) s
12 p_new = (int *)realloc(p_old,3 * sizeof(int));
(gdb) p p_old
$4 = (int *) 0x22fe30
(gdb) p p_new
$5 = (int *) 0x1c
(gdb) s
warning: Critical error detected c0000374
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000077c1f3b0 in ntdll!RtlUnhandledExceptionFilter () from C:\windows\SYSTEM32\ntdll.dll
(gdb) p p_new
No symbol "p_new" in current context.