查看原文
其他

你写过最愚蠢的代码是?

脚本之家 2023-01-18

The following article is from 嵌入式Linux Author 写代码的篮球球痴

 关注
脚本之家
”,与百万开发者在一起

来源 l 嵌入式与Linux那些事(ID:gh_748eaf2209b0)
如若转载请联系原公众号

最近写的一些代码,拿出来给大伙看看,毕竟丢的是我的脸。

第一个,是帮忙一个朋友看的力扣题目,然后就自己写了下

题目如下:

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;
}

还有,这样的一个题目

c语言中怎么求出一句话(字符串)里的最长的单词?

https://www.zhihu.com/question/561203467/answer/2724830240

char str[] = "May there be enough clouds in your life to make a beautiful sunset";

我写了这样的一段代码

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

typedef struct {
char* p;
char len;
} world_t;


int main() {
char str[] = "May there be enough clouds in your life to make a beautiful sunset";
world_t max_t = {0},temp_t = {0};
temp_t.p = str;
for (int i=0;i<sizeof(str);i++) {
if ((str[i] == ' ') || (str[i] == '\0')) {
str[i] = '\0';
if (max_t.len < temp_t.len) {

max_t = temp_t;

                        temp_t=(world_t){.p=&str[i+1],.len=0,};

}
} else temp_t.len++;
}

printf("%d %s\n",max_t.len,max_t.p);
return 0;
}

我愣是找不到我的程序出在了哪里

然后还是找呀找,最后发现temp_t 搞错了判断语句

判断里面的代码,修改成下面就好了
for (int i=0;i<sizeof(str);i++) {
if ((str[i] == ' ') || (str[i] == '\0')) {
str[i] = '\0';
if (max_t.len < temp_t.len) {
max_t = temp_t;
}
temp_t = (world_t){.p = &str[i+1],.len=0,};
} else temp_t.len++;
}

这是我上周末写的两个挺愚蠢的代码

<END>
兔年专属红卫衣
商品直购链接
👇👇
【☝🏼点击查看更多详情】

  推荐阅读:
墙裂推荐!这才是专属程序员们的卫衣!
谁动了我的代码?!!!
低代码没有做到的事情,ChatGPT做到了
那些只有几行,却改变了世界的代码!
这玩意儿能逆向分析代码,我直接麻了!
Office 2019/2021专业增强版,正版终身授权!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存