2012-01-22 9 views
3

Iは、各エントリは、文字列(つまり、私は、3dimensionalアレイを想定する)であり、C、で2dimensional配列をmallocしようとしているの各エントリは、文字列である2次元アレイ、、。私は多くを読んでおり、これは私の試みです。しかし、私はセグメンテーションフォルトを取得していると私は本当に何が間違っているか分からない。私は非常にプログラミングに新しいので、私は私のスタイルが良くない場合はお詫び申し上げます!のmalloc C

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

int main(int argc, char *argv[]) 
{ 
    double temp, int_check; 
    int gen, exit_flag=0, valid_input, valid, i, j; 

    char ***S; 

    printf("argc %d\n", argc); 
    if(argc < 2) 
    { 
     printf("Please enter command line arguments of the form: a R where a is the number of generators and R are relators\n"); 
    exit_flag = 1; 
    } 
    else 
    { 
     valid = sscanf(argv[1], "%lg", &temp); 
     int_check = temp - (int)temp; 
     valid_input = ((valid != 0) && (valid != EOF)) && (int_check == 0) && (temp > 0); 

     if(!valid_input) 
     { 
      printf("Invalid input, the number of generators must be an integer > 0\n"); 
      exit_flag = 1; 
     } 
     gen = (int)temp; 

     printf("Number of generators = %d\n", gen); 
    } 

    if(exit_flag==0) 
    { 

     S = (char***)malloc(2*sizeof(char**));  /*Defintes the grid to the size required*/ 
     if(S == NULL) 
     { 
      printf("Cannot allocate memory for the S"); 
     } 

     for(i=0; i<2; i++) 
     { 
      S[i] = (char**)malloc((argc-2)*sizeof(char*)); 
      if(S[i] == NULL) 
      { 
       printf("Cannot allocate memory for the S"); 
      } 
     }             /*Grid finished being given the right size*/ 

     for(i=2; i<argc; i++)        /*Put the relators in the grid. Make rhs equal 1*/ 
     { 
      strcpy(S[0][i-2], argv[i]); 
      strcpy(S[1][i-2], "1"); 
      printf("relator %s\n", S[0][i-2]); 
     } 

     printf("The array S is\n"); 
     for(j=0; j<(argc-2); j++) 
     { 
      for(i=0; i<2; i++) 
      { 
       printf(" %s ", S[i][j]); 
      } 
      printf("\n"); 
     } 
    } 

    else /*If the inputs are invalid, exit the program*/ 
    { 
     exit(EXIT_FAILURE); 
    } 

    for(i=0; i<2; i++) 
    { 
     free(S[i]); 
    } 
    free(S); 

    return 0; 
} 

答えて

2

あなただけにそれらの希望の文字を指し、様々なポインタのため、実際の文字の任意のメモリを割り当てることはありません。割り当てをここに追加してください:

for(i=2; i<argc; i++)  /* Put the relators in the grid. Make rhs equal 1*/ 
{ 
    S[0][i-2] = malloc(strlen(argv[i]) + 1); // allocate memory for the data 
    strcpy(S[0][i-2], argv[i]); 
    strcpy(S[1][i-2], "1"); 
    printf("relator %s\n", S[0][i-2]); 
} 

最後にすべての混乱を解放することを忘れないでください。

私は繰り返しstrcpy sは、あなたがやりたいことはよく分かりません。 strcpyはヌルターミネータを追加して、文字列がそこで終わるようにします。おそらくstrncpyはあなたの状況にとってより便利な機能です。

+0

お返事をありがとうそんなに!これは本当に便利です。私は文字列の各文字にメモリを割り当てる必要があることを認識しました。 – user1163974

1

あなたの問題はstrcpy(S[0][i-2], argv[i]);のような行です。あなたはこの文字列にスペースを割り当てなかったので、ガベージ・ポインタです。 代わりにS[0][i-2]=strdup(argv[i])を使用してください。

+0

おかげで、それは今のstrdup – user1163974

+0

を使用して動作します 'strdup'はPOSIXではなく、 "標準" C.

+0

おかげです。私はそれを覚えていませんでした。 – asaelr

0

そのコードでメモリエラーがたくさんあります。時々あなたはmalloc'ingなしで自由にすることができます。文字列のサイズをチェックせずに文字列をコピーすると、実際に文字列にメモリを割り当てないことがあります。

+0

いいえ、彼は 'char *** S'を望んでいます。それは文字列の2次元配列でなければなりません。 – asaelr