我是一名新的C程序员,指针+数组让我很烦恼。我没有得到任何错误,代码运行良好......直到中间某处代码开始起作用,因为数组中的某些元素设置为我想要的其他元素。我想知道是否有一个程序在代码完成运行后可视化代码的内存?
我跑完后的等等:
#include<stdio.h>
int main(){
int array[2] = {0,1};
array[1] = 4;
printf("%d\n",array[1]);
}
它将显示一个内存块,其中数组有两个元素,分别为0和4。
现在为了避免遇到数组包含先前操作的元素的问题,我通过执行以下操作清除该数组的内存:
memset(tokenized,0,MAX_CHARS);
它似乎有效,但我不知道它是否实际上正在做我认为它在后端做的事情。
编辑: 我现在正在使用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的东西 谢谢!
答案 0 :(得分:4)
使用Valgrind:
Valgrind是一个用于调试和分析Linux程序的GPL系统。 使用Valgrind的工具套件,您可以自动检测许多内存 管理和线程错误,避免数小时令人沮丧 寻找错误,让你的程序更稳定。你也可以表演 详细的分析,以帮助加快您的程序。
答案 1 :(得分:0)
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:~$
答案 2 :(得分:0)
我不认为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");
(在循环之后,test
仅在tokenized
中的每个字节都为零时才为0。)
您不会在代码中永久保留此内容:如果您传递正确的参数,您可以信任memset
执行您想要的操作。
你从Valgrind得到的错误是一个不同的问题:你碰巧用两个指向相同数据的指针调用strncpy
,例如。
strncpy(ptr, ptr, 6);
并且该数据未初始化。就像在,它基本上是随机的:你的程序还没有写任何东西到那个内存块。
(另外,如果使用-g
编译(调试符号),Valgrind将为您提供更多信息,包括行号。)