C语言中如何复制void*参数到char*并解决内存访问错误
问题与解决:字符串比较函数的内存错误修复
我编写了一个接收void*类型参数的函数,需将参数内容复制到字符串中进行比较,后续要修改副本为大写形式,不希望改变传入的原始参数。但无论尝试哪种变量分配方式,AddressSanitizer总会报不同的错误。
初始错误代码
int compare_string(void* item1, void* item2){ char *a =" "; char *b= " "; strcpy(a,item1); strcpy(b,item2); if(strcmp(a,b)==0) return 0; else if(strcmp(a,b)>0) return 1; else return -1; }
AddressSanitizer报错信息
==12556==ERROR: AddressSanitizer: SEGV on unknown address 0x555d336ce39d (pc 0x148b654e2168 bp 0x7ffebf70ead0 sp 0x7ffebf70eaa8 T0) ==12556==The signal is caused by a WRITE memory access. #0 0x148b654e2168 (/lib/x86_64-linux-gnu/libc.so.6+0x19f168) #1 0x555d336cd265 in compare_string (/home/matteo/Scrivania/Algo/laboratorio-algoritmi-2021-2022-main/Esercizio 2/ex2/build/main+0x2265) #2 0x555d336cd110 in search_skip_list (/home/matteo/Scrivania/Algo/laboratorio-algoritmi-2021-2022-main/Esercizio 2/ex2/build/main+0x2110) #3 0x555d336cc86c in search_in_file (/home/matteo/Scrivania/Algo/laboratorio-algoritmi-2021-2022-main/Esercizio 2/ex2/build/main+0x186c) #4 0x555d336cca1e in main (/home/matteo/Scrivania/Algo/laboratorio-algoritmi-2021-2022-main/Esercizio 2/ex2/build/main+0x1a1e) #5 0x148b6536cd8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 #6 0x148b6536ce3f in __libc_start_main_impl ../csu/libc-start.c:392 #7 0x555d336cc304 in _start (/home/matteo/Scrivania/Algo/laboratorio-algoritmi-2021-2022-main/Esercizio 2/ex2/build/main+0x1304) AddressSanitizer can not provide additional info.
修正后的代码
已解决该问题,修正后的代码如下(之前strlen失效是因为指针处理有误,现已修复):
int compare_string(void* item1, void* item2){ char *a =malloc(strlen(item1)*sizeof(char*)); char *b= malloc(strlen(item2)*sizeof(char*)); strcpy(a,item1);strcpy(b,item2); if(strcmp(a,b)==0) { free(a);free(b); return 0; } else if(strcmp(a,b)>0) { free(a);free(b); return 1; } else { free(a);free(b); return -1; } }
内容的提问来源于stack exchange,提问作者Matteo Pagliarello
相关产品推荐
相关产品推荐

