0

私がしなければならないことは、次のとおりです。定義された最大の x 文字列 s_1 ... s_x を読み取ります。長さ l=1000000 にして保存します。変数 x は入力として与えられ、表現はグローバルに定義する必要があります。

私がやりたい方法は次のとおりです。

  1. char へのポインターへのポインターをグローバルに定義します。

    char** S;
    
  2. ローカルで、入力から x を読み取った後、char への x ポインター用のスペースを割り当てます。

    S = (char**) malloc(sizeof(char*)*x);
    
  3. 単一の文字列 s_i ごとにローカルにスペースを割り当て、割り当てられたスペースに文字列を読み取ります。

    while(i<x){
        S[i] = (char*) malloc(sizeof(char)*1000000);
        scanf("%s",S[i]);
        i++;
    }
    

アクセスしようとすると

    S[0][0]

メモリ アクセス エラーが発生します。何か案は?ありがとう!


編集:

私は配列を印刷し、それはうまくいったので、問題は実際にアクセスコードにあります。ここにあります: 誰でも何が問題なのか分かりますか? できないから…

    makeBinary(){

        printf("inside makeBinary()\n");

        S_b = malloc(sizeof(int)*1000000*x);
        length = malloc(sizeof(int)*x);
        int i;
        int j;
        for(i=0;i<x;i++){
            for(j=0;j<1000000;j++){ printf("1\n");  
                if(S[i][j]=='\0'){  printf("2\n");
                    length[i] = j; 
                        break;                  
                }else{  
                    S_b[i][j] = S[i][j]-96;     printf("3\n");      
                }   
            }
        }       
    }

「1」を出力してからクラッシュします。コードが最適とはほど遠いことはわかっていますが、今のところ、最初に問題を解決したいと思います。ありがとう!

4

2 に答える 2

0

進行中の多くのことがあります:
奇妙なキャスト malloc を変更しましたが、動作は不安定です。
また、メモリをコピーするために sprintf を使用しないでください...常に最大を割り当てるとは限りません。
正しい量を割り当てることができますstrlen()+1...最後に0を追加してください...次のようなものです:

int t = 100;
char * buffer = malloc(sizeof(char*)*t);
S = &buffer;

for( int i = 0; i<10 ; i++){
    char * somestring = __FILE__;
    size_t len = strlen(somestring);
    S[i] = (char*) malloc(len+1);
    S[i][len] = 0;
    memcpy(S[i], somestring,len);
}
于 2013-05-02T20:55:29.703 に答える
0
#include <stdio.h>
#include <stdlib.h>

char** S;

int main(void){
    int i = 0, x = 100;
    S = (char**) malloc(sizeof(char*) * x);//t --> x

    while(i<x){
        S[i] = (char*) malloc(sizeof(char)*1000000);
        if(S[i]==NULL){// check return of malloc
            perror("memory insufficient");
            return -1;
        }
        scanf("%s",S[i]);
        i++;
    }
    printf("%s\n", S[0]);//fine
    printf("%c\n", S[0][0]);//fine
    return 0;
}
于 2013-05-02T22:32:22.093 に答える