-1

这是我的代码:

 #include<stdio.h>



    struct p{

           char* d;
           };

    typedef struct p* pt;

    int main(){
        pt opt;
        opt=(pt)malloc(sizeof(struct p));

        scanf("%s",(opt->d));


        printf("%s",opt->d);



        getch();

        return 0;

        }

每次我运行它时,它都会接受并打印字符串,但会发生错误。在调试时它告诉存在分段错误但不指出它在哪里?出了什么问题,这似乎是相当正确的。

4

5 回答 5

2

您曾经malloc为您的结构分配空间,但不是为您要读入的字符串分配空间。您也需要这样做。这是从您的问题转述的示例:

 pt opt = malloc(sizeof(struct p));
 opt->d = malloc(MAX_STRING_LENGTH);
于 2013-04-27T19:19:10.727 回答
2

是的,问题是你必须为char * d;

1)为like分配内存char * d(在上面的回复中提到)
opt->d = malloc(expected_max_len + 1);

2)或者您可以在结构中声明具有最大缓冲区长度的缓冲区:
char d[MAX_LENGTH];

于 2013-04-27T20:30:51.967 回答
1

scanf 将扫描的字符串放入 char 缓冲区。但是在您的代码中,您的 char 指针没有指向任何应该指向缓冲区的东西

如果你的 gcc>2.7,你可以使用"%ms". 这将允许 scanf 为您的指针分配内存

scanf("%ms",(opt->d));
于 2013-04-27T19:19:48.373 回答
0

您必须为char* d;

int main(){
    pt opt;
    opt=(pt)malloc(sizeof(struct p));
    opt->d = malloc( sizeof( char )* 80);
    scanf("%s",(opt->d));    //this might overflow
于 2013-04-27T19:18:46.913 回答
0

您需要将正确的缓冲区传递给scanf不仅仅是指向某处的指针。

struct p{
   char* d;
};

typedef struct p* pt;

int main(){
    pt opt;
    opt=(pt)malloc(sizeof(struct p));

    opt->d = malloc(expected_max_len + 1);

    scanf("%s",(opt->d));


    printf("%s",opt->d);

    free(opt->d);


    getch();

    return 0;

}
于 2013-04-27T19:19:27.963 回答