#每日话题#
“今天把最近写的一些代码,拿出来给大伙看看,毕竟丢的是我的脸
第一个,是帮忙一个朋友看的力扣题目,然后就自己写了下。”
题目如下:https://leetcode.cn/problems/median-of-two-sorted-arrays/
代码写成这样:
void merge(int* nums1, int m, int* nums2, int n){
int p = m-- + n-- -1;
printf("1,p=%d m=%d n=%d\n",p,m,n);
while (m >= 0 && n >= 0) {
nums1[p--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
}
/*当m = 0的时候*/
while (n >= 0) {
printf("3,p=%d m=%d n=%d\n",p,m,n);
nums1[p--] = nums2[n--];
}
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int sum = nums1Size + nums2Size;
int* nums12 = (int*)malloc(sum);
if (!nums12) {
printf("malloc error\n");
return -0.1;
}
double result = 0.0;
memset(nums12,0,sum);
printf("nums1Size=%d nums2Size=%d num12[0]=%d\n",nums1Size,nums2Size,nums12[0]);
memcpy(nums12,nums1,nums1Size);
merge(nums12,nums1Size,nums2,nums2Size);
if (sum % 2 == 0) {
result = (nums12[sum/2 -1] + nums12[sum/2]) / 2;
} else {
result = (nums12[sum/2] / 2);
}
free(nums12);
return result;
}
错误在下面:
*** Error in `/data/study/ttt': free(): invalid next size (fast): 0x0000000000602010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777f5)[0x7ffff7a847f5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8038a)[0x7ffff7a8d38a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ffff7a9158c]
/data/study/ttt[0x4009b9]
/data/study/ttt[0x400a37]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7ffff7a2d840]
/data/study/ttt[0x400649]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fd:11 4718834 /data/study/ttt
00600000-00601000 r--p 00000000 fd:11 4718834 /data/study/ttt
00601000-00602000 rw-p 00001000 fd:11 4718834 /data/study/ttt
00602000-00623000 rw-p 00000000 00:00 0 [heap]
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0
7ffff75f3000-7ffff7609000 r-xp 00000000 fd:01 410135 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7609000-7ffff7808000 ---p 00016000 fd:01 410135 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7808000-7ffff7809000 rw-p 00015000 fd:01 410135 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7809000-7ffff780c000 r-xp 00000000 fd:01 412308 /lib/x86_64-linux-gnu/libdl-2.23.so
7ffff780c000-7ffff7a0b000 ---p 00003000 fd:01 412308 /lib/x86_64-linux-gnu/libdl-2.23.so
7ffff7a0b000-7ffff7a0c000 r--p 00002000 fd:01 412308 /lib/x86_64-linux-gnu/libdl-2.23.so
7ffff7a0c000-7ffff7a0d000 rw-p 00003000 fd:01 412308 /lib/x86_64-linux-gnu/libdl-2.23.so
7ffff7a0d000-7ffff7bcd000 r-xp 00000000 fd:01 412545 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7bcd000-7ffff7dcd000 ---p 001c0000 fd:01 412545 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dcd000-7ffff7dd1000 r--p 001c0000 fd:01 412545 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd1000-7ffff7dd3000 rw-p 001c4000 fd:01 412545 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd3000-7ffff7dd7000 rw-p 00000000 00:00 0
7ffff7dd7000-7ffff7dfd000 r-xp 00000000 fd:01 412537 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7edd000-7ffff7edf000 rw-p 00000000 00:00 0
7ffff7eed000-7ffff7eee000 rw-p 00000000 00:00 0
7ffff7eee000-7ffff7ef1000 r-xp 00000000 fd:01 410062 /lib/x86_64-linux-gnu/libonion_security.so.1.0.19
7ffff7ef1000-7ffff7ff1000 ---p 00003000 fd:01 410062 /lib/x86_64-linux-gnu/libonion_security.so.1.0.19
7ffff7ff1000-7ffff7ff2000 rw-p 00003000 fd:01 410062 /lib/x86_64-linux-gnu/libonion_security.so.1.0.19
7ffff7ff2000-7ffff7ff6000 rw-p 00000000 00:00 0
7ffff7ff6000-7ffff7ffa000 r--p 00000000 00:00 0 [vvar]
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0 [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00025000 fd:01 412537 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7ffd000-7ffff7ffe000 rw-p 00026000 fd:01 412537 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Program received signal SIGABRT, Aborted.
0x00007ffff7a42438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
这个硬是在周末查了好久……
申请内存的时候太过于想当然了:
上面的代码,需要把
int* nums12 = (int*)malloc(sum);
修改成
int* nums12 = (int*)malloc(sum*sizeof(int));
下面也需要对应修改
memset(nums12,0,sum);
memcpy(nums12,nums1,nums1Size);
正确的代码如下:
void merge(int* pnums1, int m, int* pnums2, int n){
int p = m-- + n-- -1;
while (m >= 0 && n >= 0) {
pnums1[p--] = pnums1[m] > pnums2[n] ? pnums1[m--] : pnums2[n--];
}
/*当m = 0的时候*/
while (n >= 0) {
pnums1[p--] = pnums2[n--];
}
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int sum = nums1Size + nums2Size;
int* nums12 = (int*)malloc(sum*sizeof(int));
double result = 0.0;
memset(nums12,0,sum);
memcpy(nums12,nums1,nums1Size*sizeof(int));
merge(nums12,nums1Size,nums2,nums2Size);
if (sum % 2 == 0)
result = (double)(nums12[sum/2 -1] + nums12[sum/2]) / 2;
else
result = (nums12[sum/2]);
free(nums12);
return result;
}
以上是作者写的为自认挺愚蠢的代码。
请大家分享:你写过愚蠢的代码吗?写过最愚蠢的代码又是什么呢?(cr:嵌入式Linux ,写代码的篮球球痴)
话题奖励如下:
1、所有参与回帖的用户,均可获得10家园币(家园币可以兑换礼品);
2、抽两位幸运的友友各送出500家园币。
|
确实出现过很多BUG...
这期话题有些高大上的感觉呀!