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

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

题目如下:

https://leetcode.cn/problems/median-of-two-sorted-arrays/

9c58b848ebe1adf604b29a0f4db7b4c1.png

代码写成这样

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

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

10538f9635fc999a6039f1cd7a966bce.jpeg

ce0b750634231b58b84e8388e2e2a2b8.jpeg

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐