3

私は新しいCプログラマーであり、ポインターと配列が私をめちゃくちゃにしています。エラーは発生せず、コードは正常に実行されます...配列内の一部の要素が意図した以外の値に設定されているため、コードが途中で動作し始めるまで。実行終了後にコードのメモリを視覚化するプログラムがあるかどうか知りたいですか?

例:実行後:

#include<stdio.h>
int main(){
    int array[2] = {0,1};
    array[1] = 4;
    printf("%d\n",array[1]);
    }

配列に0と4の2つの要素があるメモリのブロックが表示されます。

今のところ、配列に前のアクションの要素が含まれているという問題が発生しないように、次のようにしてその配列のメモリをクリアします。

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は、LinuxプログラムをデバッグおよびプロファイリングするためのGPLシステムです。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同じデータを指す2つのポインターを使用して呼び出している場合があります。たとえば、

 strncpy(ptr, ptr, 6);

and that data is uninitialised. As in, it is essentially random: your program hasn't written anything to that block of memory yet.

(Also, if you compile with -g (debugging symbols) Valgrind will give you more informative output, including line numbers.)

于 2012-06-18T11:06:34.803 に答える