-1

したがって、少なくとも今のところ、文字列のテキストとそのサイズを含む単純な String 構造体を作成しようとしています。ただし、構造体の割り当てに問題があります。現在、1文字のサイズを機能させようとしていますが、この時点でクラッシュするだけで、割り当てで何が間違っているのかわかりません。助けてください。

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


typedef struct{
    char* text;
    int size;
}String;

String* getString();

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

    String* str1 = getString();
    printf("%s",str1->text);    
    free(str1);
    return 0;
 }

String* getString(){
    String* str = (String*)malloc(sizeof(String));
    scanf("%s",str->text);
    str->size++;
    return str;
}
4

3 に答える 3

2

にはメモリを割り当てませんstr->text。初期化しないままにしておくと、プログラムは未定義の動作を呼び出します。

文字列の最大サイズであるstr->text = malloc(MAX_SIZE);whereを使用してメモリを割り当てる必要があります。MAX_SIZEまたは、文字列が短い場合は、代わりに通常の固定サイズの配列を使用できます。

scanf()さらに、おそらく文字列のスキャンには使用したくないでしょう。特定の理由の 1 つは、最初の空白文字で停止することです%s。もう 1 つの理由は、バッファーが小さすぎる場合にバッファーを超えて書き込むのscanf()を防ぐのは簡単ではないということです..代わりに使用するのはどうですか?scanf()fgets()

fgets(str->text, MAX_SIZE, stdin);

より優れた安全なアプローチです。

于 2013-06-06T21:17:43.373 に答える
2

構造体だけでなく文字列にもメモリを割り当てる必要がありtextます。

scanf("%s",str->text);

str->text初期化されていないポインタです。

于 2013-06-06T21:16:12.250 に答える
0
int main(int argc, char** argv){
    String* str1 = getString();
    printf("%s",str1->text);
    free(str1->text);
    free(str1);
    return 0;
 }

String* getString(){
    String* str = (String*)malloc(sizeof(String));//for struct
    str->size = 16;//initialize
    str->text = (char*)malloc(sizeof(char)*str->size);//for input text
    int ch, len;
    while(EOF!=(ch=fgetc(stdin)) && ch != '\n'){
        str->text[len++]=ch;
        if(str->size==len){
            str->text = realloc(str->text, sizeof(char)*(len+=16));
        }
    }
    str->text[len++]='\0';
    str->text = realloc(str->text, sizeof(char)*(str->size=len));
    return str;
}
于 2013-06-06T22:13:42.150 に答える