0

これが私のコードです:


 #include        
 #include        

 int main(int argc, char *argv[]) {

        const char **keywords;
        const char **values;
        char line[50];
        char *prop, *val, *tmp;
        int i = 0, j = 0;
        FILE *creds = fopen("/path/to/file.props", "r");

        keywords = malloc(5);
        values = malloc(5);

        while (fgets(line, LINE_SIZE, creds) != NULL) {
                if (line[strlen(line) - 1] == '\n')
                        line[strlen(line) - 1] = '\0';
                prop = line; 
                while(*(prop++) != '=') {
                        i++;
                }       
                tmp = prop;
                prop = malloc(i + 1);
                strncpy(prop, line, i);
                prop[i] = '\0';
                keywords[j] = prop;
                val = malloc(strlen(line) - strlen(prop));
                strcpy(val, tmp);
                values[j++] = val;
                i = 0;
        }
printf("%s %s %s %s %s\n", keywords[0], keywords[1], keywords[2], keywords[3], keywords[4]);
}

                                                                                                                         

今、file.propsその内容があります:


hostaddr=127.0.0.1
port=5432
user=username
password=mypass
dbname=my_db_name

プログラムを実行すると、次のようになります。

@raddr ポート ユーザー パスワード dbname

行にコメントを付けて適切にvalues[j++] = valインクリメントjすると、出力は次のようになります。

hostaddr ポート ユーザー パスワード dbname 。

誰かが私を導き、私のコードの問題を示すことができますか?

4

1 に答える 1

3

台詞

keywords = malloc(5);
values = malloc(5);

5バイトのメモリを提供します。代わりに 5 つの要素配列が必要だと思います。これらは次のように割り当てられます

keywords = malloc(5 * sizeof(*keywords));
values = malloc(5 * sizeof(*values));

keywords 現在、とに割り当てられたメモリの最後を超えて書き込みを行っていますvalues。この影響は未定義 (予測不可能) ですが、一方の配列の終わりを超えて書き込むと、もう一方の配列で使用されているメモリが破損しているように思えます。

于 2013-02-22T13:27:56.483 に答える