3

我是一个新的 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 谢谢!

4

3 回答 3

4

使用Valgrind

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

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​</p>

于 2012-06-18T10:33:41.357 回答
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:~$ 
于 2012-06-18T10:53:24.327 回答
0

我不认为 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");

(循环之后,test只有当每个单个字节tokenized都为零时才为 0。)

但是,您不会希望在您的代码中永久使用它:memset如果您传递正确的参数,您可以相信它会做您想做的事情。


你从 Valgrind 得到的错误是一个不同的问题:你碰巧strncpy用两个指向相同数据的指针调用,例如

 strncpy(ptr, ptr, 6);

并且该数据未初始化。例如,它本质上是随机的:您的程序还没有向该内存块写入任何内容。

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

于 2012-06-18T11:06:34.803 回答