1

ここに奇妙な出力があります。原因と解決方法を教えていただけないでしょうか。

int inp_str(char * string, char ** pointers[])
{
    char * tmp[stringsCount];
    if (strlen(string) > maxlen)
    return (-1);
    else {
    tmp[count] = malloc(sizeof(char) * strlen(string));
    strcpy(tmp[count], string);
    pointers[count] = &tmp[count];
    count++;
    }
    return count;

}


int main(){

    //char * strings[stringsCount];
    char ** pointers[stringsCount];
    inp_str( "sdasya", pointers);
    inp_str( "dasd", pointers);
    inp_str( "qwe", pointers);
    inp_str( "dasd", pointers);

    //sort(pointers, count);
    printf("%s", *pointers[0]);
    printf("\n%s", *pointers[1]);
    printf("\n%s", *pointers[2]);
    printf("\n%s", *pointers[3]);
}

出力は次のとおりです。

sdasya
��uNH��H�l$ H�\$L�d$(L�l$0H��8�f.�
qwe
�bs7

PS。stringCount は定数です。カウント = 0

4

3 に答える 3

0

ここで何をしようとしているのかよくわかりません。しかし、いずれにせよ、いくつかの問題があります。

1) 文字列を初期化されていないポインタにコピーしています。つまり、任意の場所を指す (char *) の配列を作成し、その場所に文字列をコピーします。tmp を文字列に向けようとしている場合は、strcpy を使用しないでください。単に tmp[count]=string; を介して割り当てます。

2) tmp はスタック上に作成されるため、その値をポインター ** に割り当て、この関数のスコープ外のアドレスを参照しようとすると、そのメモリがなくなり、破損したデータが表示される可能性があります。

お役に立てれば。好奇心から、この関数で何をしようとしていますか?

于 2013-10-08T14:07:17.483 に答える
0

関数が返された後にポインターを失うことに加えてtmp[]、実際に必要な量よりも 1 バイト少ないバイトを常に割り当てます。文字列の長さstrlen(s)を返します。これには、終端の NUL バイトは含まれません。必要なものは次のとおりです ( sizeof(char) は定義により1 であることに注意してください):

  char *p = malloc(strlen(string) + 1);
  strcpy (p, string);

文字列を複製します。

于 2013-10-08T14:18:21.580 に答える