如何检查C代码使用的内存?

如何检查C代码使用的内存?,c,memory,C,Memory,我是一个新的C程序员,指针+数组把我弄得一团糟。我没有任何错误,代码运行良好……直到中间的某个地方,代码开始起作用,因为数组中的某些元素被设置为我所希望的以外的东西。我想知道是否有一个程序可以在代码运行完毕后可视化代码的内存 例如,在我跑步之后: #include<stdio.h> int main(){ int array[2] = {0,1}; array[1] = 4; printf("%d\n",array[1]); } 它似乎很有效,但我不

我是一个新的C程序员,指针+数组把我弄得一团糟。我没有任何错误,代码运行良好……直到中间的某个地方,代码开始起作用,因为数组中的某些元素被设置为我所希望的以外的东西。我想知道是否有一个程序可以在代码运行完毕后可视化代码的内存

例如,在我跑步之后:

#include<stdio.h>
int main(){
    int array[2] = {0,1};
    array[1] = 4;
    printf("%d\n",array[1]);
    }
它似乎很有效,但我不知道它是否真的在做我认为它在后端所做的事情

编辑: 我现在正在使用Valgrind,我只想知道,我如何知道错误指的是哪条线? 例如,我得到了这个:

==24394== Source and destination overlap in strncpy(0x7ff000006, 0x7ff000006, 6)
==24394==    at 0x4C2C236: strncpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24394==    by 0x400D8A: tokenize_quotes (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394==    by 0x40184E: main (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394== 
==24394== Conditional jump or move depends on uninitialised value(s)
==24394==    at 0x4C2C007: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24394==    by 0x400E06: tokenize_quotes (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394==    by 0x40184E: main (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394== 
但我不知道错误在哪一行?我知道它是关于strcpy的 谢谢

使用:

Valgrind是一个用于调试和评测Linux程序的GPL系统。 使用Valgrind的工具套件,您可以自动检测许多内存 管理和线程错误,避免数小时令人沮丧 bug搜索,使您的程序更稳定。你也可以表演 详细的分析,以帮助加快您的程序。​


​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

valgrind是一个不错的工具,试着用它

avinash@ubuntu:~$ valgrind ./test
==2559== Memcheck, a memory error detector
==2559== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==2559== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==2559== Command: ./test
==2559== 
4
==2559== 
==2559== HEAP SUMMARY:
==2559==     in use at exit: 0 bytes in 0 blocks
==2559==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==2559== 
==2559== All heap blocks were freed -- no leaks are possible
==2559== 
==2559== For counts of detected and suppressed errors, rerun with: -v
==2559== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
avinash@ubuntu:~$ 

我不认为Valgrind是你想要的工具:Valgrind真的很适合检查未初始化的内存和无效的内存访问(等等),但在这种情况下,我不认为Valgrind会回答这个问题

如果您想检查内存是否为零(即,您已正确重置内存),可以使用

char test = 0;
unsigned i;
for (i = 0; i < MAX_CHARS; i++) {
   test |= tokenized[i];
}
printf("Memory %s zero\n", test == 0 ? "is" : "isn't");
而这些数据是未初始化的。与中一样,它本质上是随机的:您的程序还没有向该内存块写入任何内容


(另外,如果您使用
-g
(调试符号)编译,Valgrind将提供更多信息输出,包括行号。)

您可以使用调试器轻松验证,并在调用
memset
之前和之后检查标记化
中的一些随机条目。我总是这样运行valgrind:valgrind-v--tool=memcheck--leak check=full--show reachable=yes。它总是显示行号,所以应该会有帮助(我只是不记得哪个命令打开了,所以我从我的一个脚本复制了它)。使用
-g
编译代码,以指示编译器也生成调试信息。像
Valgrind
gdb
这样的工具可以使用这些信息将虚拟地址映射到源代码中的行。
char test = 0;
unsigned i;
for (i = 0; i < MAX_CHARS; i++) {
   test |= tokenized[i];
}
printf("Memory %s zero\n", test == 0 ? "is" : "isn't");
 strncpy(ptr, ptr, 6);