-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

您需要为结构分配内存,还需要为text字符串分配内存。

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

str->text是一个未初始化的指针。

于 2013-06-06T21:16:12.250 回答
2

您没有为str->text. 你让它未初始化,所以你的程序调用未定义的行为。

您需要使用字符串的最大大小为它分配str->text = malloc(MAX_SIZE);内存MAX_SIZE。或者,如果你的字符串很短,你可以使用一个常规的、固定大小的数组来代替。

此外,您可能不想scanf()用于扫描字符串。一个特别的原因是%sscanf()第一个空白字符处停止。scanf()另一个原因是,如果缓冲区太小,防止写入超出缓冲区并非易事。fgets()改用它怎么样?

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

是一种更好、更安全的方法。

于 2013-06-06T21:17:43.373 回答
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 回答