2013-04-27 50 views
-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; 

     } 

每次我运行它,它接受并打印字符串不错,但发生一个错误。 在调试时,它告诉我们存在分段错误,但是不指向它的位置? 这是怎么回事,这似乎是相当正确的。

+1

您不需要在C程序中投射'malloc'的返回值。 – 2013-04-27 19:17:40

+1

@CarlNorum更确切地说,你**不能**投它。 – 2013-04-27 19:18:41

回答

1

scanf将扫描的字符串放到char缓冲区中。但在你的代码中你的char指针并不指向任何它应该指向缓冲区的东西

如果你的gcc> 2.7,你可以使用"%ms"。这将允许SCANF为指针

scanf("%ms",(opt->d)); 
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 
+0

请不要将'void *'强制转换为'T *'。 – 2013-04-27 19:19:13

+0

'sizeof(char)'是'1'。 – 2013-04-27 19:19:24

2

你以前malloc为您的结构分配空间分配内存,而不是你要读的字符串。你需要做到这一点。下面是你的问题转述的例子:

pt opt = malloc(sizeof(struct p)); 
opt->d = malloc(MAX_STRING_LENGTH); 
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; 

} 
2

Yupp分配内存,问题是,你必须为所分配的内存为char * d等(上述答复中提到char * d;

1)分配内存)
opt->d = malloc(expected_max_len + 1);

2)或者,可以在结构与最大缓冲区长度声明缓冲液:
char d[MAX_LENGTH];

+0

您应该注意1和2有不同的效果,需要采取不同的措施。 – GRAYgoose124 2013-04-27 20:52:50

相关问题