2013-04-27 76 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

相關問題