0

私は3つのファイルを持っています:

何か.h

typedef struct {
    int size_t;
    char *c;
} p;

p ** createMatrix(int r, int c);

void printMatrix(p **matrix, const int r, const int c);

何か.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "something.h"

p **
createMatrix(int r, int c)
{
    int rowsize=r*2+1;
    int colsize=c*2+1;

    /* memory alloc of rows */
    p **matrix=malloc(rowsize*sizeof(p *));
    int k;
    for(k=0; k<rowsize; k++)
    {
        /* memory alloc of columns */
        matrix[k]=malloc(colsize*sizeof(p));
    } 
    int i, j;
    for(i=0; i<rowsize; i++)
    {
        for(j=0; j<colsize; j++)
        {
            /* columns is between letters */
            if(j%2!=0)
            {   
                matrix[i][j].size_t=7;
                matrix[i][j].c=malloc(8*sizeof(char));
                strcpy(matrix[i][j].c,"       ");
            }
            else if(i%2==0 && j%2==0)
            {
                matrix[i][j].size_t=1;
                matrix[i][j].c=malloc(sizeof(char));
                *(matrix[i][j].c)='a';
            }
            else
            {
                matrix[i][j].size_t=1;
                matrix[i][j].c=malloc(sizeof(char));
                *(matrix[i][j].c)=' ';
            }
        }
    }       
    return matrix;
}

void
printMatrix(p **matrix, const int r, const int c)
{
    int rowsize=r*2+1;
    int colsize=c*2+1;
    printf("\n");
    int i, j;
    for(i=0; i<rowsize; i++)
    {
        printf("\t");
        for(j=0; j<colsize; j++)
        {
            if(matrix[i][j].size_t==1)
                printf("%c", *matrix[i][j].c);
            else
                printf("%s", matrix[i][j].c);

        }
        printf("\n");
    }
    printf("\n");
 }

main.c

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

void
printMenufunction(p **matrix, int rows, int cols)
{
    int rowsize=rows*2+1;
    int colsize=cols*2+1;
    /* memory alloc of rows */
    matrix=malloc(rowsize*sizeof(p *));
    int i;
    for(i=0; i<rowsize; i++)
    /* memory alloc of columns */
        matrix[i]=malloc(colsize*sizeof(p));
    matrix=createMatrix(rows, cols);
}

int
main(void)
{
    int rows, cols;
    p **matrix;
    char stringtemp[3];
    printf("ask for row and col in form (5x5):\n");
    scanf("%s", stringtemp);
    sscanf(stringtemp, "%dx%d", &rows, &cols);
    printMenufunction(matrix, rows, cols);
    printMatrix(matrix, rows, cols);
    return 0;
}

私のプログラムの簡略化されたバージョンであるこのコード サンプルでは、​​セグメンテーション エラーが発生します。gdb でデバッグしたので、これらの行のどこかに問題があることがわかりました。助けていただければ幸いです、ありがとう。

更新: このバージョンはデバッグできません。より多くのコードを含む私の古いプログラムは、この領域に沿っていると教えてくれましたが、少なくともどこにあるのかわかりませんか? そのため、セグメンテーション違反を引き起こしている行を正確に投稿することはできません。知っていれば、自分で問題を処理できたと思います。誰かが私よりもはっきりとそれを見ることができることを願っていました..

4

2 に答える 2

1

まず第一に、単に「これらの行のどこかにある」と言うのではなく、gdb が示したどの行に問題があるかを教えていただけると大変助かります。gdb は、どの行でエラーが発生したかを正確に伝えることができるはずです。

とは言え、以下が候補です。

char *stringtemp;
printf("ask for row and col in form (5x5):\n");
scanf("%s", stringtemp);

stringtemp意味のある場所を指すように割り当てられていません。あなたが持っているのは、初期値がindeterminateであるポインターだけです。これは潜在的な segfault の 1 つです。stringtempを指すバッファを割り当てるか、単に次の配列として割り当てcharます。

char stringtemp[SOME_SIZE]; // where SOME_SIZE is as big as you need.

なぜマトリックスを割り当てているのprintMenuFunctionですか?! なぜあなたのcreateMatrix機能を使用していないのですか?!

編集

私は年をとるのが嫌いです。createMatrixから呼び出されていることを完全に見逃しましたprintMenuFunction(つまり、のmalloc呼び出しprintMenuFunctionは冗長であり、削除する必要があります)。

printMenuFunction次のように書き換えます。

void printMenuFunction(p ***matrix, int rows, int cols)
{
  *matrix = createMatrix(rows, cols);
}

その関数内で の要素にアクセスする必要がある場合は、次のように添え字を適用するmatrixに逆参照する必要があることに注意してください。

(*matrix)[i][j].size = ...;

main次のように書き換えます。

int
main(void)
{
    int rows, cols;
    p **matrix;
    char stringtemp[3]; // 3 is not big enough to hold a string like "5x5";
                        // that requires an array size of *at least* 4.  
                        // "10x10" would require 6 characters.  You need
                        // an extra character for the 0 terminator.

    printf("ask for row and col in form (5x5):\n");
    scanf("%s", stringtemp);
    sscanf(stringtemp, "%dx%d", &rows, &cols);
    printMenufunction(&matrix, rows, cols); // note the & in front of matrix
    printMatrix(matrix, rows, cols);
    return 0;
}
于 2012-11-07T20:42:58.533 に答える
1

C は値渡し言語であるため、関数の引数への代入は、引数のローカル コピーのみを変更するため、printMenufunction返されたときにmatrixまだ初期化されていません。

参照によってマトリックスへのポインターを渡す必要があります。

printMenufunction(&matrix, rows, cols);
printMatrix(&matrix, rows, cols);

関数内で逆参照します。例えば:

//                       v Pointer to the double-pointer
void printMenufunction(p ***matrix, int rows, int cols)
{
    int rowsize=rows*2+1;
    int colsize=cols*2+1;
    /* memory alloc of rows */
//  v Dereferencing the pointer
    *matrix=malloc(rowsize*sizeof(p *));
   // ...
}
于 2012-11-07T20:35:56.427 に答える