0

私はポインターに非常に苦労しています。私が達成しようとしている音は、私の耳にはかなり単純です。多次元のchar配列を定義しますが、そのサイズは定義しません。次に、2番目のメソッドで必要なメモリを割り当て、要求されたデータで埋めます.

今、私はこれを達成するために数え切れないほどの時間を試み、目が乾くまでGoogleで検索しましたが、まだ修正できていません. そのため、これがどのように可能になるかについて、あなたの誰かが何か洞察を持っていることを望んでいました.

私が想像しているのは、ポインターと、メソッドで使用されるchar** filesカウンターを定義することです。次に、印刷ファイルが変数を calloc および malloc し、関連するデータを入力します。int total_filesprint_files()

以下のコードでは、これを試みました。ただし、実行時に、「セグメンテーション違反 (コアダンプ)」という非常に詳細なメッセージが表示されます。GDB でデバッグすると、次の場所を指します。

 13  *files[i] = malloc(sizeof(char) * 100);

さて、これは C プログラミング (Linux 用) の入門コースであり、ここで多数のエラーが表示される可能性があります。お時間をいただきありがとうございます。メソッド/ポインターなしでコードを機能させるのに問題はなかったので、何らかの形で構文を混同している可能性があると確信しています。

#define _SVID_SOURCE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dirent.h>
#include <time.h>

int print_files(char*** files, int* total_files) {
int size = 10;  
**files = calloc(size, sizeof(char *));
for(int i = 0; i < size; i++) {
    *files[i] = malloc(sizeof(char) * 100);
}
*total_files = size;
}

int main() {
char** files;
int num_files;
num_files = 0;
printf("-- Start print_files\n");

print_files(&files, &num_files);

printf("-- end print_files, number of files: %d\n", num_files);

for(int i = 0; i < num_files; i++)
    printf("Out: %s\n", files[i]);

printf("total_files=%d\n", num_files);

return 0;
}
4

3 に答える 3

1

ここに作業バージョンがあります:

#include <stdio.h>
#include <stdlib.h>

static void print_files(char ***files, int *total_files)
{
    int size = 10;  
    *files = calloc(size, sizeof(char *));
    for (int i = 0; i < size; i++)
    {
        (*files)[i] = malloc(sizeof(char) * 100);
        sprintf((*files)[i], "Line %d\n", i);
    }
    *total_files = size;
}

int main(void)
{
    char **files;
    int num_files;
    num_files = 0;
    printf("-- Start print_files\n");

    print_files(&files, &num_files);

    printf("-- end print_files, number of files: %d\n", num_files);

    for(int i = 0; i < num_files; i++)
        printf("Out: %s\n", files[i]);

    printf("total_files=%d\n", num_files);

    return 0;
}

出力は次のとおりです。

-- Start print_files
-- end print_files, number of files: 10
Out: Line 0
Out: Line 1
Out: Line 2
Out: Line 3
Out: Line 4
Out: Line 5
Out: Line 6
Out: Line 7
Out: Line 8
Out: Line 9
total_files=10

valgrind「ふるいのようにリークする」と言いますが、割り当てられている間はメモリを乱用しません。

何が変わったのですか?

トリプルポインターは怖いです。ただし、 を使用した代入では、1 レベルの間接参照のみを使用したいと考えていますcalloc()。( doubleの場合、GCC は、 inが初期化されていない状態で使用され*ていると警告しました!) 次に、ループ内では、かっこを囲むことも重要です。は、新しく割り当てられた文字列を初期化するだけです。filesmain()(*files)sprintf()

main()コードを大幅に変更しませんでした。

于 2012-11-01T01:56:35.493 に答える
1
char **ppchar;
int x;
int y;

ppchar = (char**)malloc(sizeof(char*) * 100);
for (x = 0; x < 100; x++) {
    ppchar[x] = (char*)malloc(sizeof(char) * 100);
}

for(x = 0; x < 100; x++) {
    for(y = 0; y < 100; y++) {
        ppchar[x][y] = rand() % 255; // ascii range
    }
}

for(x = 0; x < 100; x++) {
    for(y = 0; y < 100; y++) {
        // char -128 to 127 or 0 to 255 - it's mostly machine
        // dependent.  This will tell you.
        printf("%d\t",ppchar[x][y]);
    }
}

//make sure to clean up the memory
for (x = 0; x < 100; x++) {
    free(ppchar[x]);
}

free(ppchar);

return 0;
}
于 2012-11-01T01:42:58.037 に答える
1
**files = calloc(size, sizeof(char *));

filesこれは、有効なメモリを指すだけでなく、そのメモリの値も、変更されるポインターを指す有効なポインターであると想定しています。

問題は

char** files;
...
print_files(&files, &num_files);

&filesは有効なポインタですが、(**(&files))( によって逆参照される) は初期化されていないprint_filesため不正な参照です。files

そのprint_files行はおそらく読むべきです

*files = calloc(size, sizeof(char *));

.

という問題もあります

*files[i] = malloc(sizeof(char) * 100);

これはと同等です

*(files[i]) = malloc(sizeof(char) * 100);

私はあなたがおそらく意味すると思います

(*files)[i] = malloc(sizeof(char) * 100);
于 2012-11-01T01:46:37.010 に答える