You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:15:32