如何检查C代码使用的内存?
我是一个新的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]); } 它似乎很有效,但我不
#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);