Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字符串存储到结构中声明的字符指针中_C - Fatal编程技术网

C 如何将字符串存储到结构中声明的字符指针中

C 如何将字符串存储到结构中声明的字符指针中,c,C,这是我的代码: #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->

这是我的代码:

 #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;

        }
#包括
结构p{
char*d;
};
类型定义结构p*pt;
int main(){
pt-opt;
opt=(pt)malloc(sizeof(struct p));
scanf(“%s”,(opt->d));
printf(“%s”,opt->d);
getch();
返回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

您使用
malloc
为结构分配空间,但不为要读入的字符串分配空间。你也需要这样做。下面是根据您的问题改写的一个示例:

 pt opt = malloc(sizeof(struct p));
 opt->d = malloc(MAX_STRING_LENGTH);

您需要将正确的缓冲区传递给
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;

}

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

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

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

是的,问题是你必须为
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
1) 为
char*d
like(在上述回复中提到)分配内存
opt->d=malloc(预期最大长度+1)

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

chard[MAX_LENGTH]

您不需要在C程序中强制转换
malloc
的返回值。@CarlNorum更准确地说,您不能强制转换它。请不要将
void*
强制转换为
t*
。您应该注意1和2具有不同的效果,需要采取不同的措施。