debugging Valgrind ==16958==大小为4的写入无效[已关闭]

djmepvbi  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(137)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
16小时前就关门了。
Improve this question
[valgrind消息]

==16958== 1 errors in context 1 of 2:
==16958== Invalid read of size 4
==16958==    at 0x109637: arr_del (in /home/students/s/smelov.vp/lab3/lab3)
==16958==    by 0x10939D: main (in /home/students/s/smelov.vp/lab3/lab3)
==16958==  Address 0x4a19938 is 0 bytes after a block of size 24 alloc'd
==16958==    at 0x483E7CF: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==16958==    by 0x109541: arr_corr (in /home/students/s/smelov.vp/lab3/lab3)
==16958==    by 0x109323: main (in /home/students/s/smelov.vp/lab3/lab3)

[功能代码]

int main(){
    int input=0;
    int *arr;
    int s;
    size_t index;
    scanf("%d", &input);
    switch(input){
    case 2:
        scanf("%zu", &index);
        arr = arr_corr(arr, index, &s);
        arr_output(arr, s);
        break;

    case 3:
        scanf("%zu", &index);
        arr = arr_del(arr, index, &s);
        arr_output(arr, s);
        break;
    }
}

int* arr_corr(int *arr, size_t index, int *s){
    int n;
    (*s) = (*s)+1;
    arr = (int*) realloc(arr, (size_t)(*s) * sizeof(int));
    for(size_t i = (size_t)((*s)-1); i>=index; i--){
        arr[i+1] = arr[i];
    }
    scanf("%d", &n);
    arr[index]= n;
    return arr;
}

int* arr_del(int *arr, size_t index, int *s){
    for(size_t i=index; i<(size_t)(*s); i++){
        arr[i]=arr[i+1];
    }
    (*s)=(*s)-1;
    arr = (int*) realloc (arr, (size_t)(*s) * sizeof(int));
    return arr;
}

我只是不明白这条信息是什么意思,我做错了什么。请帮帮我!我所知道的一切就是main()函数和其他任何东西都没有问题。代码位于两个文件中。链接这些文件也没有问题。

6za6bjd0

6za6bjd01#

==16958==  Address 0x4a19938 is 0 bytes after a block of size 24 alloc'd
==16958==    at 0x483E7CF: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)

您重新分配了大小为24字节(6 int s)的内容。

==16958== Invalid read of size 4
==16958==    at 0x109637: arr_del (in /home/students/s/smelov.vp/lab3/lab3)

您试图读取超出该内存末尾的内容(字节25到27,或索引为6的int数组)。
如果使用调试信息(-g)编译代码,则会更清楚。
为了解决这个问题,你要么需要分配更多的内存,要么做一些事情,比如改变你的循环控制,这样你就可以更快地停止,不要读得太远。

相关问题